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

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 Bmob+Luban(鲁班)压缩图片实现相册选择图片压缩后上传到Bmob后台Glide加载图片显示到本地,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

源代码已上传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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/134129.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!