android中压缩图片的几种方法比较

第一种压缩方式:

 ByteArrayOutputStream baos =  new  ByteArrayOutputStream();  
        image.compress(Bitmap.CompressFormat.JPEG,  100 , baos);
         int  options =  100 ;  
         while  ( baos.toByteArray().length /  1024 > 100 ) {  
            baos.reset();
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);
            options -=  10 ;
        }  
        ByteArrayInputStream isBm =  new  ByteArrayInputStream(baos.toByteArray());  
        Bitmap bitmap = BitmapFactory.decodeStream(isBm,  null ,  null );


首先该方法会先把图片100质量压进输出流里,然后判断输出流的长度,如果输出流的长度大于100kb的话,即图片在内存中的占的大小大于100KB,就会进行循环,以每次减少10质量的的方式进行压缩。但是当我使用了这个方法为图片进行压缩之后,程序报出了illegalArgument这个异常,进行跟踪发现错误出在循环内部的压缩代码里。于是我debug了下,发现了问题。图片第一次压缩,baos的长度大于100,然后进入循环进行压缩,压缩完了之后baos的长度依久不变,而options经过不断的循环值会达到负数从而程序异常。后来通过查询各种资料了解了问题:这种压缩方式称之为质量压缩,它是在改变图片的位深及透明度,在保证像素不变和图片质量的同时对图片进行压缩,压缩之后的图片文件大小会发生改变,但是图片占用内存的大小却不会发生改变。

第二种压缩方式:

ByteArrayOutputStream out = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, out);
BitmapFactory.Options newOpts =  new  BitmapFactory.Options();  
int be = 2;
newOpts.inSampleSize = be; 
ByteArrayInputStream isBm =  new  ByteArrayInputStream(out.toByteArray());   
Bitmap bitmap = BitmapFactory.decodeStream(isBm,  null ,  <span style="line-height: 27.2px; font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif;">newOpts </span><span style="line-height: 27.2px; font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif;">);</span>
第二种压缩方式是采样率压缩法,因为采样率是使用整数,所以不能很好的保证压缩完之后的图片的质量,不过能大大的减少内存的使用。

第三种压缩方式:

ByteArrayOutputStream out = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 85, out);
float zoom = (float)Math.sqrt(size * 1024 / (float)out.toByteArray().length);

Matrix matrix = new Matrix();
matrix.setScale(zoom, zoom);

Bitmap result = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), matrix, true);

out.reset();
result.compress(Bitmap.CompressFormat.JPEG, 85, out);
while(out.toByteArray().length > size * 1024){
System.out.println(out.toByteArray().length);
matrix.setScale(0.9f, 0.9f);
result = Bitmap.createBitmap(result, 0, 0, result.getWidth(), result.getHeight(), matrix, true);
out.reset();
result.compress(Bitmap.CompressFormat.JPEG, 85, out);
} 
这种压缩方式是通过缩放进行压缩。


第四中压缩方式:

Android  2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework包下的android.media.ThumbnailUtils位置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取。
/** 
 *  
 * 创建一个指定大小的缩略图 
 * @param source 源文件(Bitmap类型) 
 * @param width  压缩成的宽度 
 * @param height 压缩成的高度 
 */  
ThumbnailUtils.extractThumbnail(source, width, height);  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值