簡體   English   中英

不使用Bitmap#compress()方法將JPEG圖像壓縮到特定質量級別

[英]Compress JPEG image to specific quality level without using Bitmap#compress() method

我想將位圖(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和圖像數據部分有所不同,請參見: 在2張圖像照片之間進行差異檢查

那么如何在不使用Bitmap#compress()方法的情況下將JPEG圖像壓縮到特定的質量級別? 因為我真的希望結果字節數組在結構上相似。

JPEG中沒有“質量級別”的概念。 一些編碼器用來選擇量化表的簡寫形式。 JPEG壓縮中有許多變量,包括掃描的類型和分類,樣本,霍夫曼表選擇和量化表選擇。 如果您使用的編碼器中的任何一個不同,您將獲得不同的輸出。 這是野獸的天性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM