LuBan图片压缩+ImageSelector实现仿微信9张图片选择或者无限图片批量选择压缩

版权声明:本文为博主原创文章,如果需要可以未经本人允许转载,未经本人授权一概产生法律问题本人概不负责 https://blog.csdn.net/qq_16519957/article/details/88905044

LuBan图片压缩+ImageSelector实现9张图片或者无限图片批量选择压缩
关于ImageSelector我就放一张原作者的图片上来
在这里插入图片描述
源码:https://github.com/donkingliang/ImageSelector

然后就是我的源代码地址已上传github:
https://github.com/307572384/ImageSelector-masteraddLuban

下面是我用9图选择+Luban实现批量图片压缩的效果图
在这里插入图片描述
前言:我遇到一些问题就是Luban的图片批量压缩怎么压缩,imageSelector选择到的图片地址我已经获取到了是一个Arraylist的集合封装然后我去找了一下有没什么案例结果找到了一个然后最终实现的时候我发现一个问题,就是那个一直在循环压缩不断出图,然后我从Luban那个开源的地址的源代码研究出来了,就是直接给本地也加上一个Arraylist然后就可以获取到相应的Arraylist集合存储的文件然后进行压缩。这个用的是最新版本的鲁班就ok了。下面我们来看代码

开头+一个Arraylist

	private void y_Luban(final ArrayList<String> images) {
		Luban.with(mContext)
				.load(images)
				.setTargetDir(getPath())
				.ignoreBy(100)
				.setCompressListener(new OnCompressListener() {
					@Override
					public void onStart() {

					}

					@Override
					public void onSuccess(File file) {

						mAdapter.refresh(images);//将图片更新到recyview上面去


					}

					@Override
					public void onError(Throwable e) {

					}
				}).launch();
	}

存储地址不用改成Arraylist 直接这样用就可以了

	//存放鲁班压缩完后的图片你可以不写但是为了看效果所以就先这么写着
	private String getPath() {
		String path = Environment.getExternalStorageDirectory() + "/Luban/image/";
		File file = new File(path);
		if (file.mkdirs()) {
			return path;
		}
		return path;
	}

然后我们来看一下完整的代码
MainActivity

package com.donkingliang.imageselectdemo;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

import com.donkingliang.imageselectdemo.adapter.ImageAdapter;
import com.donkingliang.imageselector.utils.ImageSelector;

import java.io.File;
import java.util.ArrayList;

import top.zibin.luban.Luban;
import top.zibin.luban.OnCompressListener;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

	private static final int REQUEST_CODE = 0x00000011;


	private ArrayList<String> mImages;//用于存放图片的地址
	private Context mContext = this;
	private RecyclerView rvImage;
	private ImageAdapter mAdapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		rvImage = findViewById(R.id.rv_image);
		rvImage.setLayoutManager(new GridLayoutManager(this, 3));
		mAdapter = new ImageAdapter(this);
		rvImage.setAdapter(mAdapter);

		findViewById(R.id.btn_single).setOnClickListener(this);
		findViewById(R.id.btn_limit).setOnClickListener(this);
		findViewById(R.id.btn_unlimited).setOnClickListener(this);
		findViewById(R.id.btn_clip).setOnClickListener(this);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == REQUEST_CODE && data != null) {
			ArrayList<String> images = data.getStringArrayListExtra(ImageSelector.SELECT_RESULT);//使用Arraylist存储选择到的图片路径
			boolean isCameraImage = data.getBooleanExtra(ImageSelector.IS_CAMERA_IMAGE, false);
			//            Log.d("ImageSelector", "是否是拍照图片:" + isCameraImage);
			//            mAdapter.refresh(images);
			y_Luban(images);

		}
	}

	//存放鲁班压缩完后的图片你可以不写但是为了看效果所以就先这么写着
	private String getPath() {
		String path = Environment.getExternalStorageDirectory() + "/Luban/image/";
		File file = new File(path);
		if (file.mkdirs()) {
			return path;
		}
		return path;
	}


	private void y_Luban(final ArrayList<String> images) {
		Luban.with(mContext)
				.load(images)
				.setTargetDir(getPath())
				.ignoreBy(100)
				.setCompressListener(new OnCompressListener() {
					@Override
					public void onStart() {

					}

					@Override
					public void onSuccess(File file) {

						mAdapter.refresh(images);//将图片更新到recyview上面去


					}

					@Override
					public void onError(Throwable e) {

					}
				}).launch();
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
			case R.id.btn_single:
				//单选
				//                ImageSelectorUtils.openPhoto(MainActivity.this, REQUEST_CODE, true, 0);
				ImageSelector.builder()
						.useCamera(true) // 设置是否使用拍照
						.setSingle(true)  //设置是否单选
						.setViewImage(true) //是否点击放大图片查看,,默认为true
						.start(this, REQUEST_CODE); // 打开相册
				break;

			case R.id.btn_limit:
				//多选(最多9张)
				//                ImageSelectorUtils.openPhoto(MainActivity.this, REQUEST_CODE, false, 9);
				//                ImageSelector.builder().setSingle(true).start(this,REQUEST_CODE);
				//                ImageSelectorUtils.openPhoto(MainActivity.this, REQUEST_CODE, false, 9, mAdapter.getImages()); // 把已选的传入。
				ImageSelector.builder()
						.useCamera(true) // 设置是否使用拍照
						.setSingle(false)  //设置是否单选
						.setViewImage(true) //是否点击放大图片查看,,默认为true
						.setMaxSelectCount(9) // 图片的最大选择数量,小于等于0时,不限数量。
						.start(this, REQUEST_CODE); // 打开相册
				break;

			case R.id.btn_unlimited:
				//多选(不限数量)
				//                ImageSelectorUtils.openPhoto(MainActivity.this, REQUEST_CODE);
				//                ImageSelectorUtils.openPhoto(MainActivity.this, REQUEST_CODE, mAdapter.getImages()); // 把已选的传入。
				//或者
				//                ImageSelectorUtils.openPhoto(MainActivity.this, REQUEST_CODE, false, 0);
				//                ImageSelectorUtils.openPhoto(MainActivity.this, REQUEST_CODE, false, 0, mAdapter.getImages()); // 把已选的传入。

				ImageSelector.builder()
						.useCamera(true) // 设置是否使用拍照
						.setSingle(false)  //设置是否单选
						.setViewImage(true) //是否点击放大图片查看,,默认为true
						.setMaxSelectCount(0) // 图片的最大选择数量,小于等于0时,不限数量。
						.start(this, REQUEST_CODE); // 打开相册
				break;

			case R.id.btn_clip:
				//单选并剪裁
				//                ImageSelectorUtils.openPhotoAndClip(MainActivity.this, REQUEST_CODE);
				ImageSelector.builder()
						.useCamera(true) // 设置是否使用拍照
						.setCrop(true)  // 设置是否使用图片剪切功能。
						.setSingle(true)  //设置是否单选
						.setViewImage(true) //是否点击放大图片查看,,默认为true
						.start(this, REQUEST_CODE); // 打开相册
				break;
		}
	}

}

ImageAdapter

package com.donkingliang.imageselectdemo.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.donkingliang.imageselectdemo.R;

import java.io.File;
import java.util.ArrayList;

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder> {

	private Context           mContext;
	private ArrayList<String> mImages;
	private LayoutInflater    mInflater;

	public ImageAdapter(Context context) {
		mContext = context;
		this.mInflater = LayoutInflater.from(mContext);
	}

	public ArrayList<String> getImages() {
		return mImages;
	}

	@Override
	public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
		View view = mInflater.inflate(R.layout.adapter_image, parent, false);
		return new ViewHolder(view);
	}

	@Override
	public void onBindViewHolder(final ViewHolder holder, final int position) {
		final String image = mImages.get(position);
		Glide.with(mContext).load(new File(image)).into(holder.ivImage);
	}

	@Override
	public int getItemCount() {
		return mImages == null ? 0 : mImages.size();
	}

	public void refresh(ArrayList<String> images) {
		mImages = images;
		notifyDataSetChanged();
	}

	static class ViewHolder extends RecyclerView.ViewHolder {

		ImageView ivImage;

		public ViewHolder(View itemView) {
			super(itemView);
			ivImage = itemView.findViewById(R.id.iv_image);
		}
	}
}

注意:如果需要用到rxjava可以自行添加照着那个Luban的源代码来就行了

猜你喜欢

转载自blog.csdn.net/qq_16519957/article/details/88905044