Bitmap.compress - 没有工作

时间:2017-01-15 17:58:25

标签: java android bitmap compression image-compression

我试图压缩相机拍摄的照片而不缩放图像尺寸。

我尝试过bitmap.compress,但它没有用。 只是为了确保我尝试压缩从资源加载的位图,但仍然没有成功。

任何想法?

示例代码:

//load bitmap from resources:
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.trolltunga);
Log.d("roee", "onImageCaptured: before compress = " + bitmap.getByteCount() + ", " + bitmap.getWidth() + ", " + bitmap.getHeight());

//compressing
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bos);
Bitmap comp = BitmapFactory.decodeStream(new ByteArrayInputStream(bos.toByteArray()));
Log.d("roee", "onImageCaptured: after compress = " + comp.getByteCount() + ", " + comp.getWidth() + ", " + comp.getHeight());

记录结果:

D/roee: onImageCaptured: before compress = 10800000, 3000, 900
D/roee: onImageCaptured: after compress = 10800000, 3000, 900

2 个答案:

答案 0 :(得分:4)

短版本:您压缩位图并在之后立即解压缩

长版:

未压缩Bitmap。它是一个字节数组的容器类,用于表示完整大小的图像,以便更快地绘制和处理。

它通常用于以其他格式加载图片,让我们将JPEG表示到内存中进行显示或编辑,并有多种方法可以直接加载或保存为其他文件格式。

其中一个是compress,它以压缩文件格式(在您的情况下为JPEG)中转换未压缩的字节数组,然后将其输出到流中,以便将其保存到存储器或其他内容。

当您使用BitmapFactory.decodeStream时,它会读取流中的信息,识别文件格式并解码到未压缩的字节数组。通常,您只需使用它来加载图像表单存储。

你在这里做的是取Bitmap,将其压缩为JPEG(丢失一些信息),然后再将JPEG解码为未压缩的Bitmap,它具有相同的分辨率,因此字节数相同且相同记忆中的大小。

<强>解决方案: 如果要查看压缩是否有效,只需使用bos.toByteArray().length

测量输出流大小

答案 1 :(得分:0)

您无法压缩位图。只有ByteArrayOutputStream被压缩为某种格式(如JPEG),您可以检查ByteArrayOutputStream的压缩长度。