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压缩后的大小,我的原始图片是6MB这里不放上了。

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

在这里插入图片描述
这个是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

Luban(鲁班)——Android图片压缩工具,仿微信朋友圈压缩策略。项目描述目前做app开发总绕不开图片这个元素。但是随着手机拍照分辨率的提升,图片压缩成为一个很重要的问题。单纯对图片进行裁切,压缩已经有很多文章介绍。但是裁切成多少,压缩成多少却很难控制好,裁切过头图片太小,质量压缩过头则显示效果太差。于是自然想到app巨头“微信”会是怎么处理,Luban(鲁班)就是通过在微信朋友圈发送近100张不同分辨率图片,对比原图与微信压缩后的图片逆向推算出来的压缩算法。因为有其他语言也想要实现 Luban,所以描述了一遍算法步骤 因为是逆向推算,效果还没法跟微信一模一样,但是已经很接近微信朋友圈压缩后的效果,具体看以下对比!效果与对比内容原图LubanWechat截屏 720P720*1280,390k720*1280,87k720*1280,56k截屏 1080P1080*1920,2.21M1080*1920,104k1080*1920,112k拍照 13M(4:3)3096*4128,3.12M1548*2064,141k1548*2064,147k拍照 9.6M(16:9)4128*2322,4.64M1032*581,97k1032*581,74k滚动截屏1080*6433,1.56M1080*6433,351k1080*6433,482k导入compile 'io.reactivex:rxandroid:1.2.1' compile 'io.reactivex:rxjava:1.1.6' compile 'top.zibin:Luban:1.0.5'使用Listener方式Luban内部采用io线程进行图片压缩,外部调用只需设置好结果监听即可Luban.get(this)     .load(File)                     //传人要压缩图片     .putGear(Luban.THIRD_GEAR)      //设定压缩档次,默认三挡     .setCompressListener(new OnCompressListener() { //设置回调         @Override         public void onStart() {             //TODO 压缩开始前调用,可以在方法内启动 loading UI         }         @Override         public void onSuccess(File file) {             //TODO 压缩成功后调用,返回压缩后的图片文件         }         @Override         public void onError(Throwable e) {             //TODO 当压缩过去出现问题时调用         }     }).launch();    //启动压缩RxJava方式RxJava 调用方式请自行随意控制线程Luban.get(this)         .load(file)         .putGear(Luban.THIRD_GEAR)         .asObservable()         .subscribeOn(Schedulers.io())         .observeOn(AndroidSchedulers.mainThread())         .doOnError(new Action1() {             @Override             public void call(Throwable throwable) {                 throwable.printStackTrace();             }         })         .onErrorResumeNext(new Func1>() {             @Override             public Observable<? extends File> call(Throwable throwable) {                 return Observable.empty();             }         })         .subscribe(new Action1() {             @Override             public void call(File file) {                 //TODO 压缩成功后调用,返回压缩后的图片文件             }         }); 标签:Luban(鲁班)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻烟飘荡

我想吃甜筒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值