用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - android代码库

图片压缩类

2013-07-06 作者: 云代码会员举报

[android]代码库

package com.mosjoy.ad.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Base64;

public class ImageUtils {
	
	//质量压缩
	public static Bitmap compressImage(Bitmap image, int size) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
		int options = 100;
		while ( baos.toByteArray().length / 1024>50) {	//循环判断如果压缩后图片是否大于50kb,大于继续压缩		
			baos.reset();//重置baos即清空baos
			image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
			options -= 10;//每次都减少10
		}
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
		return bitmap;
	}
	
	//图片按比例大小压缩方法
	public static Bitmap getImageFromPath(String srcPath, int size, float width) {
		BitmapFactory.Options newOpts = new BitmapFactory.Options();
		//开始读入图片,此时把options.inJustDecodeBounds 设回true了
		newOpts.inJustDecodeBounds = true;
		Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空
		newOpts.inJustDecodeBounds = false;
		int w = newOpts.outWidth;
		int h = newOpts.outHeight;
		//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
		float hh = 800f;//这里设置高度为800f
		//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
		int be = 1;//be=1表示不缩放
		if (w > width) {//如果宽度大的话根据宽度固定大小缩放
			be = (int) (newOpts.outWidth / width);
		} 
//		else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
//			be = (int) (newOpts.outHeight / hh);
//		}
		if (be <= 0)
			be = 1;
		newOpts.inSampleSize = be;//设置缩放比例
		//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
		bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
		return compressImage(bitmap, size);//压缩好比例大小后再进行质量压缩
	}
	
	//图片按比例大小压缩方法
	public static Bitmap compBitmap(Bitmap image) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();		
		image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
		if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出	
			baos.reset();//重置baos即清空baos
			image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中
		}
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
		BitmapFactory.Options newOpts = new BitmapFactory.Options();
		//开始读入图片,此时把options.inJustDecodeBounds 设回true了
		newOpts.inJustDecodeBounds = true;
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
		newOpts.inJustDecodeBounds = false;
		int w = newOpts.outWidth;
		int h = newOpts.outHeight;
		//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
		float hh = 800f;//这里设置高度为800f
		float ww = 150f;//这里设置宽度为480f
		//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
		int be = 1;//be=1表示不缩放
		if (w > ww) {//如果宽度大的话根据宽度固定大小缩放
			be = (int) (newOpts.outWidth / ww);
		} 
//		else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
//			be = (int) (newOpts.outHeight / hh);
//		}
		if (be <= 0)
			be = 1;
		newOpts.inSampleSize = be;//设置缩放比例
		//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
		isBm = new ByteArrayInputStream(baos.toByteArray());
		bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
		return compressImage(bitmap, 50);//压缩好比例大小后再进行质量压缩
	}
	
	//图片按比例大小压缩方法
	public static Bitmap compBitmap(InputStream inputStream, int size, float width) {
		BitmapFactory.Options newOpts = new BitmapFactory.Options();
		//开始读入图片,此时把options.inJustDecodeBounds 设回true了
		newOpts.inJustDecodeBounds = true;
		Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, newOpts);
		newOpts.inJustDecodeBounds = false;
		int w = newOpts.outWidth;
		int h = newOpts.outHeight;
		//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
		float hh = 800f;//这里设置高度为800f
//		float ww = 150f;//这里设置宽度为480f
		//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
		int be = 1;//be=1表示不缩放
		if (w > width) {//如果宽度大的话根据宽度固定大小缩放
			be = (int) (newOpts.outWidth / width);
		} 
//		else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
//			be = (int) (newOpts.outHeight / hh);
//		}
		if (be <= 0)
			be = 1;
		newOpts.inSampleSize = be;//设置缩放比例
		//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
		bitmap = BitmapFactory.decodeStream(inputStream, null, newOpts);
		return compressImage(bitmap, size);//压缩好比例大小后再进行质量压缩
	}
	
	 // 把Bitmap转换成Base64 
    public static String getBitmapStrBase64(Bitmap bitmap) { 
            ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
            byte[] bytes = baos.toByteArray(); 
            return Base64.encodeToString(bytes, 0); 
    } 

    // 把Base64转换成Bitmap 
    public static Bitmap getBitmapFromBase64(String iconBase64) { 
            byte[] bitmapArray = Base64.decode(iconBase64,  Base64.DEFAULT); 
            return BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length); 
    }

    public static Drawable convertBitmap2Drawable(Bitmap bitmap) {
		BitmapDrawable bd = new BitmapDrawable(bitmap);
		// 因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
		return bd;
	}
}




网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...