Android图片压缩Bitmap,Drawable

原创 2016年08月30日 23:27:19

今天做的图片压缩,差点把宝宝难死。。。。主要是因为各种马虎。。不过最终还是成功了。

下面做的不知道是哪位大神的原创了,因为打开了若干个页面,所有如果冒犯到了,与我联系,我会做出相应处理。

应用场景:公司自己搭的服务器,产品有PC端,Android端和IOS端,三者要实现通信。

举一个:当Android端和Android端通信的时候,拍照发送图片,要上传给服务器,上传之前需要对图片进行缩小处理,不然上传速度慢不说,在Android端的接收者极易出现OOM

/** 
	 * 通过降低图片的质量来压缩图片 
	 * @param bmp 
	 *            要压缩的图片位图对象 
	 * @param maxSize 
	 *            压缩后图片大小的最大值,单位KB 
	 * @return 压缩后的图片位图对象 
	 */  
	public static Bitmap compressByQuality(Bitmap bitmap, int maxSize) {  
		ByteArrayOutputStream baos = new ByteArrayOutputStream();  
		int quality = 100;  
		bitmap.compress(CompressFormat.JPEG, quality, baos);  
		Tools.error("图片压缩前大小:" + baos.toByteArray().length + "byte");  
		boolean isCompressed = false;  
		while (baos.toByteArray().length / 1024 > maxSize) {  
			quality -= 10;  
			baos.reset();  
			bitmap.compress(CompressFormat.JPEG, quality, baos);  
			Tools.error("质量压缩到原来的" + quality + "%时大小为:"  
					+ baos.toByteArray().length + "byte");  
			isCompressed = true;  
		}  
		Tools.error("图片压缩后大小:" + baos.toByteArray().length + "byte");  
		if (isCompressed) {  
			Bitmap compressedBitmap = BitmapFactory.decodeByteArray(  
					baos.toByteArray(), 0, baos.toByteArray().length);  
			recycleBitmap(bitmap);  
			return compressedBitmap;  
		} else {  
			return bitmap;  
		}  
	}  


	/** 
	 * 回收位图对象 
	 *  
	 * @param bitmap 
	 */  
	public static void recycleBitmap(Bitmap bitmap) {  
		if (bitmap != null && !bitmap.isRecycled()) {  
			bitmap.recycle();  
			System.gc();  
			bitmap = null;  
		}  
	}  


	/** 
	 * 通过压缩图片的尺寸来压缩图片大小 
	 * @param bitmap 
	 *            要压缩图片 
	 * @param targetWidth 
	 *            缩放的目标宽度 
	 * @param targetHeight 
	 *            缩放的目标高度 
	 * @return 缩放后的图片 
	 */  
	public static Bitmap compressBySize(String imgPath, int targetWidth,  
			int targetHeight) {  

		BitmapFactory.Options newOpts = new BitmapFactory.Options();    
		// 开始读入图片,此时把options.inJustDecodeBounds 设回true,即只读边不读内容  
		newOpts.inPreferredConfig = Config.RGB_565;  
		Bitmap bitmap = BitmapFactory.decodeFile(imgPath,newOpts);  

		ByteArrayOutputStream baos = new ByteArrayOutputStream();  
		bitmap.compress(CompressFormat.JPEG, 100, baos);  
		BitmapFactory.Options opts = new BitmapFactory.Options();  
		opts.inJustDecodeBounds = true;  
		bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0,  
				baos.toByteArray().length, opts);  
		// 得到图片的宽度、高度;  
		int imgWidth = opts.outWidth;  
		int imgHeight = opts.outHeight;  
		// 分别计算图片宽度、高度与目标宽度、高度的比例;取大于该比例的最小整数;  
		int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth);  
		int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight);  
		if (widthRatio > 1 || heightRatio > 1) {  
			if (widthRatio > heightRatio) {  
				opts.inSampleSize = widthRatio;  
			} else {  
				opts.inSampleSize = heightRatio;  
			}  
		}  
		// 设置好缩放比例后,加载图片进内存;  
		opts.inJustDecodeBounds = false;  
		Bitmap compressedBitmap = BitmapFactory.decodeByteArray(  
				baos.toByteArray(), 0, baos.toByteArray().length, opts);  
		recycleBitmap(bitmap);  
		return compressedBitmap;  
	}  

	//保存图片到sdcard中
	public static void saveMyBitmap(String bitName,Bitmap mBitmap){
		File f = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera/" + bitName);
		try {
			f.createNewFile();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			Tools.error("在保存图片时出错:"+e.toString());
		}
		FileOutputStream fOut = null;
		try {
			fOut = new FileOutputStream(f);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
		try {
			fOut.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			fOut.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

压缩后把图片保存到本地,然后再上传到服务器

Android缩放drawable 压缩图片 matrix

Q:加载时图片时有一些图片太大,导致内存溢出,想把这些图片压缩成一个缩略图,该怎么做?不能只是缩小图片大小,而是要把体积降下来,几百K的图片压缩成几K或几百B.A1:压缩图片质量:   bitmap....
  • Vincent_czz
  • Vincent_czz
  • 2011年07月19日 15:22
  • 11590

android 根据图片url获取bitmap或者drawable,然后再进行压缩处理

经常会遇到下面几种情况:1.通过图片url生成Bitmap对象和Drawable对象。2.对网络上获取到的图片进行压缩处理。下面提供一个工具类,以后就可以直接拿来用了。...
  • sinat_21376777
  • sinat_21376777
  • 2017年07月15日 14:09
  • 1111

android获取drawable图片的id和名字的方法

ImageView img = holder.getImageView(R.id.icon); String imgName = ""; int id_up = mContext.getResourc...
  • qq_33879965
  • qq_33879965
  • 2017年03月27日 11:15
  • 344

Android Drawable 那些不为人知的高效用法

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43752383,本文出自:【张鸿洋的博客】1、概述Drawable在我们平时的开发...
  • lmj623565791
  • lmj623565791
  • 2015年02月26日 09:21
  • 161979

Android缩放drawable 压缩图片 matrix

Q:加载时图片时有一些图片太大,导致内存溢出,想把这些图片压缩成一个缩略图,该怎么做? 不能只是缩小图片大小,而是要把体积降下来,几百K的图片压缩成几K或几百B. A1: 压缩图...
  • jdsjlzx
  • jdsjlzx
  • 2012年06月04日 15:21
  • 7921

Android 中 Bitmap 和 Drawable 相互转换的方法

Drawable —> Bitmap 获取资源文件(Drawable)中的 Bitmap Resources res = getResources(); Bitmap bmp = BitmapF...
  • l_lhc
  • l_lhc
  • 2016年03月18日 14:42
  • 21202

android图片压缩的三种方式

为了避免oom的出现,几乎每个应用都会对大图进行压缩,我现在手头做的产品就有很多地方用到,以前封装工具类的时候,都是在网上找东找西,然后拼拼凑凑,有效果就行了,一直用的迷迷糊糊,这几天工作比较闲,正好...
  • u011172283
  • u011172283
  • 2016年02月24日 13:43
  • 5267

解决Android ImageView用setImageDrawable方法图片缩小的问题

今天使用assert目录存了几张图片,然后想通过imageview显示出来,结果在一个低分辨率的手机上显示正常,但是到了一个高分辨率手机上显示图片变得非常小,看了一下api   public void...
  • changemyself
  • changemyself
  • 2015年01月23日 14:08
  • 18860

android 慎用drawable中大图,造成内存溢出的解决方案

android 中调用drawable中图片,占用大量内存,造成内存溢出的解决方案。
  • chniccs
  • chniccs
  • 2016年05月11日 13:48
  • 5104

Android大图片处理

移动设备对内存的要求还是很苛刻的,即便现在主流旗舰机动辄3G、4G的内存,但是对应于每个App分得的容量来说还是有限的,我们程序猿可以用各种手段来增大单个App的需求量,但是并不是完美的解决方案。最好...
  • geofferysun
  • geofferysun
  • 2016年10月13日 11:49
  • 4726
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android图片压缩Bitmap,Drawable
举报原因:
原因补充:

(最多只允许输入30个字)