簡體   English   中英

如何在Java中壓縮jpeg圖像而不丟失該圖像中的任何元數據?

[英]How can I compress jpeg images in Java without losing any metadata in that image?

我想使用Java壓縮jpeg文件。 我是這樣做的:

  1. 將圖像讀作BufferedImage
  2. 使用壓縮率將圖像寫入另一個文件。

好吧,這看起來很簡單,但我發現ICC顏色配置文件和EXIF信息在新文件中消失了,圖像的DPI從240降到72.它看起來與原始圖像不同。 我在OS X中使用像預覽這樣的工具。它可以完美地改變圖像的質量而不會影響其他信息。

我可以用Java完成嗎? 至少保留ICC顏色配置文件並讓圖像顏色看起來與原始照片相同?

/**
 * @param inputFilenameWithPath : binary filepath
 * @param outputFilepath        : output image path
 * @param start                 : from where the image start in binary file
 * @param len                   : length of the image
 * @throws ImageAccessException
 */
public void extractImageFromBinaryFile(String inputFilenameWithPath, String outputFilepath, int start, int len) throws ImageAccessException
{
    try
    {
        File file = new File(inputFilenameWithPath);
        FileImageInputStream iis = new FileImageInputStream(file);

        // Added
        byte[] b = new byte[start];
        iis.read(b, 0, start);

        byte[] fb = new byte[]{};
        iis.read(fb);

        IIOByteBuffer iiob = new IIOByteBuffer(fb, start, len);
        iis.readBytes(iiob, len);

        OutputStream os = new FileOutputStream(outputFilepath);
        os.write(iiob.getData());
        iis.close();
        os.close();

    }
    catch (IOException ioe)
    {`enter code here`
        throw new ImageAccessException("Image File read/write error");
    }
}

最后找到一種方法來做到這一點。

使用javax.imageio.IIOImage。 它可以由JpegImageReader重寫。

但它有一個錯誤,一個錯誤持續了6年。 :(

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4924909

幸運的是,如果你做了一些黑客攻擊(偽造JFIF部分),它就可以了。 :d

所以,這個問題可以這樣解決:

  1. 使用ImageIO獲取jpeg的ImageReader
  2. 將jpeg圖像讀入內存緩沖區
  3. 如果它在錯誤4924909失敗,那么使用假的JFIF信息修復圖像緩沖區
  4. 使用ImageWriter編寫文件,讓ImageWriterParam完成這一操作。

好吧,它似乎沒問題(保存每個信息),除了一件事,輸出圖像比原始圖像更亮(或者更確切地說是蒼白)(當我使用OS X預覽壓縮照片時不會發生這種情況,所以問題必須在我的代碼或java,或我的錯誤用法:()。

所以,我在java中壓縮jpeg的問題還沒有解決。

有什么建議么?

暫無
暫無

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

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