Android中关于图片压缩的小结

Android中如何进行图片压缩处理

一、我遇到的问题

工作中遇到的问题,有天领导让我把工程中所有需要上传图片的部分都要进行优化,把图片压缩后上传。我上网查了下发现有两种方式。一、质量压缩二、尺寸压缩

二、网上的错误之处

关于这两个压缩的具体定义我就不多描述了,但是我查阅资料的时候发现网上好多文章都存在误解。大多数就认为先进行尺寸压缩后再进行质量压缩,后一步是无效。其实,这个说法是错误的,我为什么这样说呢?因为就算是先进行尺寸压缩再进行质量压缩也是有效的。

三、Android中图片的存在形式

一、文件形式(即以二进制形式存于硬盘上)二、流的形式三、bitmap形式。三种形式的区别:文件和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式都到内存也是100K。但是当图片以bitmap形式存在时,其占用的内存会瞬间变大。这也就造成了当进行质量压缩后return bitmap形式后觉得压缩无效的错觉。重点就在于你return的是bitmap!


四、下面贴出我写的图片压缩代码(用了两种压缩方式

public class BitmapCompress {


public static byte[] BitmapCompressToString(String srcPath) {

Bitmap bmp = compressImageFromFile(srcPath);


ByteArrayOutputStream baos = new ByteArrayOutputStream();

bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);

int options = 100;

while (baos.toByteArray().length / 1024 > 150) {

options -= 10;// 每次都减少10

// 循环判断如果压缩后图片是否大于150kb,大于继续压缩

baos.reset();// 重置baos即清空baos

bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);

Log.d("ROTK","baos"+baos.toByteArray().length);

// 这里压缩options%,把压缩后的数据存放到baos

}

byte[] b = baos.toByteArray();

return b;


}


private static Bitmap compressImageFromFile(String srcPath) {

BitmapFactory.Options newOpts = new BitmapFactory.Options();

newOpts.inJustDecodeBounds =true;// 只读边,不读内容

Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);


newOpts.inJustDecodeBounds =false;

int w = newOpts.outWidth;

int h = newOpts.outHeight;

float hh = 800f;//

float ww = 480f;//压缩为800*480的尺寸

int be = 1;

if (w > h && 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;// 设置采样率


newOpts.inPreferredConfig = Config.ARGB_8888;// 该模式是默认的,可不设

newOpts.inPurgeable =true;// 同时设置才会有效

newOpts.inInputShareable =true;// 。当系统内存不够时候图片自动被回收


bitmap = BitmapFactory.decodeFile(srcPath, newOpts);

return bitmap;//这里输出的事bitmap因为我们还要进行质量压缩的

}

}





恩,以上!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值