【问题标题】:Bitmap.compress doesn't decrease the Byte countBitmap.compress 不会减少字节数
【发布时间】:2017-12-07 00:47:36
【问题描述】:

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

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;
}

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

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

如何解决这个问题以使文件更小?

【问题讨论】:

    标签: android bitmap compression image-compression


    【解决方案1】:

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

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

    【讨论】:

    • 你的答案是@CommonsWare 的一个很好的补充。
    • 谢谢!希望对您有所帮助。
    【解决方案2】:

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

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

    如何解决这个问题以使文件更小?

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

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

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

    【讨论】:

    • 如此完整的答案!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多