有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java位图。压缩无效

我试图在不缩放图像大小的情况下压缩我用相机拍摄的照片

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

有什么想法吗

示例代码:

//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) 个答案

  1. # 1 楼答案

    不能压缩位图。只有ByteArrayOutputStream被压缩为特定格式,如JPEG。您可以检查ByteArrayOutputStream的压缩长度

  2. # 2 楼答案

    简短版本:压缩位图,然后立即解压缩

    长版本:

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

    它通常用于加载另一种格式的图片,比如JPEG格式的图片到内存中进行显示或编辑,并且有几种方法可以直接加载或保存为其他文件格式

    其中之一是compress,它将未压缩的字节数组转换为压缩文件格式(在您的例子中是JPEG),然后将其输出到流中,这样您就可以将其保存到存储器或其他地方

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

    你在这里做的是把一个Bitmap压缩成JPEG(失去一些信息),然后再把这个JPEG解码成一个未压缩的位图,它具有相同的分辨率,因此在内存中有相同的字节数和大小

    解决方案: 如果想查看压缩是否有效,只需使用bos.toByteArray().length测量输出流大小即可