不使用Bitmap#compress()方法将JPEG图像压缩到特定质量级别

时间:2019-05-24 12:26:30

标签: java android image image-processing jpeg

我想将位图(JPEG图像)压缩为质量64,结果存储在字节数组中。以前,我可以使用Bitmap#compress()方法来实现此目的:

public static byte[] compressJPEG(Bitmap bmp, int quality) {
    if (quality <= 0)
        return new byte[0];

    byte[] array = new byte[0];
    try {
        ByteArrayOutputStream bmpStream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, quality, bmpStream);
        array = bmpStream.toByteArray();
        bmpStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return array;
}

但是当我在不同设备上运行时,结果字节数组(具有相同的输入图像文件)是不同的。 (可能是因为它在内部使用了nativeCompress()

检查后,我发现霍夫曼表,SOS和图像数据部分有所不同,请参见: Diff check between 2 image photos

那么,如何不使用Bitmap#compress()方法将JPEG图像压缩到特定的质量级别?因为我真的希望结果字节数组在结构上相似。

1 个答案:

答案 0 :(得分:1)

JPEG中没有“质量级别”的概念。一些编码器用来选择量化表的简写形式。 JPEG压缩中有许多变量,包括扫描的类型和分类,样本,霍夫曼表选择和量化表选择。如果您使用的编码器中的任何一个不同,您将获得不同的输出。这是野兽的本质。