Bitmap.compress 不会减少字节数

Bitmap.compress doesn't decrease the Byte count

我需要压缩图像以将其发送到我的服务器。我正在尝试这样做:

private Bitmap compressImage(Bitmap bitmapImg){
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    bitmapImg.compress(Bitmap.CompressFormat.JPEG, 50, out);
    Bitmap compressed = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray()));

    return compressed;
}

但是当我比较原始位图对象和压缩后的位图对象的字节数时,我得到相同的数字:

Log.e("UNCOMPRESSED", Integer.toString(mBitmapImg.getByteCount()));
E/UNCOMPRESSED: 23970816
Log.e("COMPRESSED", Integer.toString(compressedBitmapImg.getByteCount()));
E/COMPRESSED: 23970816

我怎样才能解决这个问题以获得更小的文件?

But when I compare the Byte count of the original Bitmap object and the compressed one, I get the same number:

Bitmap 在内存中的大小基于 其分辨率(以像素为单位的宽度和高度)和位深度(每个像素的字节数,用于控制每个像素可以使用多少种颜色)。

How can I fix this to have a smaller file?

您没有文件。您在内存中有一个 Bitmap 对象。图像文件通常以压缩形式存储。特别是 JPEG、PNG、WebP 和 GIF,Android 中使用的四种主要图像格式。因此,例如,out.toByteArray() 将小于 23,970,816 字节。

此外,您没有向服务器发送 Bitmap。您正在向服务器发送图像。您需要阅读服务器的文档,或与服务器开发人员交谈,以确定他们支持哪些图像格式以及如何将图像发送到服务器(理想情况下,像 HTTP PUT 这样高效的东西)。

如果您想减小 Bitmap 的内存大小,请将其缩放为较低分辨率的图像(例如,通过 createScaledBitmap())。

您可以将位图格式从 ARGB_8888 更改为 RGB_565。这会将位图的内存占用减少一半,但也会导致质量下降。不幸的是,这是您使用 Bitmap.

所能做的最多的事情

话虽如此,您使用的压缩方法应该适用于大多数情况。这也是许多平台提倡的方法。 Firebase 的一个示例是 this.