我想将位图(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图像压缩到特定的质量级别?因为我真的希望结果字节数组在结构上相似。
答案 0 :(得分:1)
JPEG中没有“质量级别”的概念。一些编码器用来选择量化表的简写形式。 JPEG压缩中有许多变量,包括扫描的类型和分类,样本,霍夫曼表选择和量化表选择。如果您使用的编码器中的任何一个不同,您将获得不同的输出。这是野兽的本质。