Bmob+Luban(鲁班)压缩图片实现相册选择图片压缩后上传到Bmob后台Glide加载图片显示到本地

源代码已上传CSDN:https://download.csdn.net/download/qq_16519957/11068345
因为本章需要跟前面的知识结合起来看所以就做了一个前面链接方便大家查看。

利用Bmob快速实现安卓的简单登陆注册功能Bmobsdk3.6.9版本亲测可用(详细图文攻略附带处理小bug)
利用Bmob快速实现安卓的登陆注册功能带正则手机号注册验证和基本密码的判断0.2版本

Bmob实现短信登陆注册验证自动记录密码安卓6.0动态获取权限正则判断手机号和简单密码判断1.0版本(适合有一定基础阅读)Bmob最新SDK3.6.9

Bmob+Luban(鲁班)压缩图片实现相册选择图片压缩后上传到Bmob后台Glide加载图片显示到本地
我们先来看一下图片这个是成功传输到后台后图片显示的效果。

我们再去看一下Bmob后台里面的图片大小

这里我们可以看到我们传输到后台以后图片的大小就是被luban压缩后的大小,我的原始图片是6MB这里不放上了。

昨晚发生了一个小问题就是我的上传到github哪里然后在push过程中可以点击删除然后我就不小心把全部代码删除掉了然后得趁记忆力还在又重新写了一遍头痛。

Bmob+Luban(鲁班)压缩图片实现相册选择图片压缩后上传到Bmob后台Glide加载图片显示到本地
这个是LuBan的github:https://github.com/Curzibn/Luban
如果需要实现多路径9图压缩后上传的话就需要学习Arraylist然后将路径封装进去最后传输给LuBan然后再去上传到云后台即可。
详情参考这篇:https://blog.csdn.net/Lain_ComeOn/article/details/72770384
虽然有点老的文章但是效果依然给力,不过个人还是推荐一个九图图片选择器。
关于LuBan的源码解释就看一下这篇文章
https://github.com/lovetuzitong/MultiImageSelector
好了我们开始看一下LuBan如何压缩的

	private void InitLuBan(File file) {
		Luban.with(this)
				.load(file)//加载图片地址
				.ignoreBy(100)//默认100KB以下文件不压缩
				.setTargetDir(getPath())//设置保存的本地文件地址
				.setCompressListener(new OnCompressListener() {
					@Override
					public void onStart() {
							//开始压缩
					}

					@Override
					public void onSuccess(File file) {//压缩后的地址file
						tw1.setText(picturePath);
						Glide.with(Success.this).//Glide加载获取成功后压缩的图片
								load(file)
								.into(img);
						mFile = file;//将压缩后的图片地址转换成公共类

					}

					@Override
					public void onError(Throwable e) {
					}
				}).launch();//启动鲁班
	}

LuBan的使用就是这么简单只要传入图片地址,然后压缩完将图片传到服务器就行,如此的丝滑迅速。

将鲁班压缩后的地址储存到本地

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

然后我们来看看完整的代码
这里涉及到android相册选择图片的问题如果不太清楚如何调用相册选择图片可以看一下这篇文章
Android 从相册中选择照片

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.beta.bmobtest.bean.UploadCtEntity;
import com.bumptech.glide.Glide;

import java.io.File;

import cn.bmob.v3.Bmob;
import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.SaveListener;
import cn.bmob.v3.listener.UpdateListener;
import cn.bmob.v3.listener.UploadFileListener;
import top.zibin.luban.Luban;
import top.zibin.luban.OnCompressListener;

/**
 * Created by Kevein on 2019/3/1.8:39
 * Luban压缩后上传图片后Glide显示
 */

public class Success extends Activity {
	private Button bt1, bt2;//1添加图片,2上传图片
	private ImageView img;
	private TextView  tw1;//本地路径以及上传返回路径
	private String    picturePath;//图片路径
	private File      mFile;//用于存储鲁班压缩完返回的图片地址

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.success);
		Bmob.initialize(this, "");//这里替换成你的
		bt1 = (Button) findViewById(R.id.mainButton1);
		bt2 = (Button) findViewById(R.id.mainButton2);
		img = (ImageView) findViewById(R.id.mainImageView1);
		tw1 = (TextView) findViewById(R.id.mainTextView1);
		bt1.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View p1) {
				Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
				startActivityForResult(i, 1);

				// TODO: Implement this method
			}
		});
		bt2.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View p1) {
				UploadCtEntity uploadCtEntity = new UploadCtEntity();

				uploadCtEntity.setZqda("测试");
				uploadCtEntity.save(new SaveListener<String>() {


					@Override
					public void done(String p1, BmobException p2) {
						// TODO: Implement this method
						if (p2 == null) {
							uploadTp(mFile, p1);//上传图片
						}
					}
				});


				// TODO: Implement this method
			}
		});


	}

	private void uploadTp(File filePath, final String objectId) {
		//创建文件对象并传入图片路径
		final BmobFile bmobFile = new BmobFile(new File(String.valueOf(filePath)));
		bmobFile.uploadblock(new UploadFileListener() {

			@Override
			public void done(BmobException p1) {
				// TODO: Implement this method
				if (p1 == null) {
					//上传成功
					String url = bmobFile.getFileUrl();//获取图片地址
					UploadCtEntity uploadCtEntity = new UploadCtEntity();
					uploadCtEntity.setPicture(bmobFile);//设置图片对象
					uploadCtEntity.setPictureUrl(url);//设置图片地址
					uploadCtEntity.update(objectId, new UpdateListener() {

						@Override
						public void done(BmobException p1) {
							// TODO: Implement this method
							if (p1 == null) {
								Toast.makeText(Success.this, "上传成功", Toast.LENGTH_SHORT).show();
								tw1.setText(bmobFile.getFileUrl());
								Glide.with(Success.this).load(bmobFile.getFileUrl()).transform(new BitmapTran(Success.this, 16)).into(img);

							} else {
								Toast.makeText(Success.this, p1.toString(), Toast.LENGTH_SHORT).show();
							}
						}
					});
				}
			}
		});
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == 1 && resultCode == RESULT_OK && null != data) {
			Uri selectedImage = data.getData();
			String[] filePathColumn = {MediaStore.Images.Media.DATA};
			Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
			cursor.moveToFirst();
			int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
			//图片路径
			picturePath = cursor.getString(columnIndex);
			cursor.close();
			File filex = new File(picturePath);
			InitLuBan(filex);//将获取到的图片地址传到鲁班过去压缩
			//将图片显示到ImageView
			//本地路径

//			img.setImageBitmap(BitmapFactory.decodeFile(picturePath));

		}
	}

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

	private void InitLuBan(File file) {
		Luban.with(this)
				.load(file)//加载图片地址
				.ignoreBy(100)//默认100KB以下文件不压缩
				.setTargetDir(getPath())//设置保存的本地文件地址
				.setCompressListener(new OnCompressListener() {
					@Override
					public void onStart() {

					}

					@Override
					public void onSuccess(File file) {
						tw1.setText(picturePath);
						Glide.with(Success.this).//Glide加载获取成功后压缩的图片
								load(file)
								.into(img);
						mFile = file;//将压缩后的图片地址转换成公共类

					}

					@Override
					public void onError(Throwable e) {
					}
				}).launch();//启动鲁班
	}
}

BitmapTran

package com.beta.bmobtest;
import com.bumptech.glide.load.resource.bitmap.*;
import android.content.*;
import android.content.res.*;
import android.graphics.*;
import com.bumptech.glide.load.engine.bitmap_recycle.*;

public class BitmapTran extends BitmapTransformation {
    private static float radius = 0f;

    public BitmapTran(Context context) {
        this(context, 4);
    }

    public BitmapTran(Context context, int dp) {
        super(context);
        this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform,
                               int outWidth, int outHeight) {
        return roundCrop(pool, toTransform);
    }

    private Bitmap roundCrop(BitmapPool pool, Bitmap source) {
        if (source == null)
            return null;

        Bitmap result = pool.get(source.getWidth(), source.getHeight(),
								 Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(),
										 Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP,
										 BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
        canvas.drawRoundRect(rectF, radius, radius, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName() + Math.round(radius);
    }
}

UploadEntity

package com.beta.bmobtest.bean;
import cn.bmob.v3.datatype.*;
import cn.bmob.v3.*;
//上传图片数据表
public class UploadCtEntity extends BmobObject
{
		private BmobFile picture;//图片
	private String pictureUrl;//图片地址
	private String zqda;

	
	
	public void setZqda(String zqda)
	{
		this.zqda = zqda;
	}

	public String getZqda()
	{
		return zqda;
	}
	
	

	public void setPicture(BmobFile picture) {
		this.picture = picture;
	}

	public BmobFile getPicture() {
		return picture;
	}

	public void setPictureUrl(String pictureUrl) {
		this.pictureUrl = pictureUrl;
	}

	public String getPictureUrl() {
		return pictureUrl;
	}
}

最后还得感谢各位开源的朋友。

源码地址:https://github.com/307572384/bmobtest