Java 不使用位图压缩()方法将JPEG图像压缩到特定的质量级别

Java 不使用位图压缩()方法将JPEG图像压缩到特定的质量级别,java,android,image,image-processing,jpeg,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 { ByteArrayOutputSt

我想将位图(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;
}
publicstaticbyte[]压缩JPEG(位图bmp,整数质量){

如果(质量没有“质量水平”的概念在JPEG中。这是一些编码器用来选择量化表的缩写。JPEG压缩中有许多变量,包括扫描的类型和分类、采样、哈夫曼表选择和量化表选择。如果您使用的编码器中有任何变量不同,您将得到不同的输出。这是n野兽的本性。

您必须编写自己的压缩算法或使用跨平台压缩library@emandt谢谢你回答我的问题,所以如果我想创建一个结构相似的压缩JPEG图像,我有两个选择:编写自己的压缩算法,或者将整个图像传输到服务器进行处理并发送回Android/iOS?in几句话:是的。在每个操作系统的次要/主要版本或实现中(即在索尼和三星设备之间),使用的算法可能会发生变化,因此,如果你期望“固定数据”,你就不能使用它们。正如你在另一个问题中提到的,我相信如果你使用固定表(量化表和哈夫曼表),您的方法将起作用。您甚至不应该需要SOS(但您需要图像维度来重新创建它)或者EOI,尝试绑定libjpeg本机代码,并使用固定表进行编码。您可以了解如何输入。我想要的是:将img大小减少约40-50%,输出img的结构类似。因此,我可以将
App0
DQT
DHT
作为固定头,只发送
SoS
&img数据(这样他们发送速度会更快)。然后,接收器可以将数据与固定头合并,以重新构建img。您可能需要一些APPn标记来定义文件类型,具体取决于您使用的解码器。您将需要实际引用的DQT和DHT标记。