Android图片压缩:BitmapFactory.Options与inSampleSize实战

1 下载量 63 浏览量 更新于2024-08-29 收藏 85KB PDF 举报
"Android平台上的图片压缩技术主要依赖于BitmapFactory.Options对象的使用,特别是其inSampleSize属性,用于控制图片的采样率。通过调整这个参数,可以有效地减小图片在内存中的占用,防止因图片过大导致的内存溢出问题。在实际操作中,当inSampleSize设置为2时,图片的宽度和高度都会变为原来的一半,像素点数量减少至原来的四分之一,因此内存消耗也相应减小。如果inSampleSize设置为小于1的值,其效果等同于1。 图片压缩的基本流程包括以下步骤: 1. 首先,创建一个BitmapFactory.Options对象,并将其inJustDecodeBounds属性设置为true。这样在调用BitmapFactory.decode方法时,只会读取图片的原始尺寸,而不会真正加载图片到内存中。 2. 解析图片的原始宽度(outWidth)和高度(outHeight),这可以通过之前配置好的Options对象获取。 3. 根据目标需求(如屏幕尺寸或特定的宽度和高度限制)计算合适的inSampleSize值。通常,这个值会确保压缩后的图片在保持可接受质量的同时,满足尺寸要求。 4. 将Options对象的inJustDecodeBounds属性设回false,此时BitmapFactory.decode方法会加载处理后的图片到内存。 以下是一个具体的代码示例,展示了如何从字节数组中解码并压缩图片: ```java public Bitmap decodeSampledBitmapFromBytes(byte[] bytes, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); } public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { if (reqWidth == 0 || reqHeight == 0) { // 如果目标尺寸为0,则返回1,表示不进行压缩 return 1; } // 计算原始尺寸与目标尺寸的比例 int inSampleSize = 1; while ((options.outWidth / inSampleSize) >= reqWidth && (options.outHeight / inSampleSize) >= reqHeight) { inSampleSize *= 2; } return inSampleSize; } ``` 在这个代码片段中,calculateInSampleSize函数计算合适的采样率,以确保压缩后的图片大小接近于reqWidth和reqHeight。这个过程通过不断地将inSampleSize翻倍,直到原始尺寸除以inSampleSize后的值小于等于目标尺寸为止。 Android中图片压缩的关键在于正确地计算和应用inSampleSize,以达到既节省内存又保持图片质量的目的。此过程不仅适用于从字节数组中加载图片,还可以应用于从文件、资源ID或其他来源加载图片的情况。"