1

私は JPG 画像ファイルを持っています。これを BufferedImage にロードし、後で BufferedImage を JPG ファイルに書き戻します。これが私が現在行っていることです。

品質を落とさず、読み取り/書き込みを高速化するより良い方法はありますか?

読んだ:

BufferedImage image = ImageIO.read(new File(storagePath + fileName + extension));

書く:

BufferedImage image = // some jpg image         

Iterator iter = ImageIO.getImageWritersByFormatName("JPG");
if (iter.hasNext()) {
    ImageWriter writer = (ImageWriter) iter.next();
    ImageWriteParam iwp = writer.getDefaultWriteParam();
    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    iwp.setCompressionQuality(quality);

    File outFile = new File(storagePath + fileName + extension);
    FileImageOutputStream output = new FileImageOutputStream(outFile);
    writer.setOutput(output);
    IIOImage iioImage = new IIOImage(image, null, null);
    writer.write(null, iioImage, iwp);
}
4

1 に答える 1

1

元の画像の修正に使用したものと同じ量子化テーブルを使用することで、JPEG を再圧縮する際の品質の低下を最小限に抑えることができます。丸めによってシングル ビット エラーが発生する可能性は依然としてありますが、かなり近くなる可能性があります。

問題は、量子化テーブルを取得する方法です。エンコードされたもので指定できる場合は、ソース画像から値を引き出すことができます。それ以外の場合は、画像が元々同じエンコーダーを使用してエンコードされていることを期待する必要があります。

「品質値」は JPEG の一部ではありません。一部のエンコーダで使用される量子化テーブルを選択する方法です。LIBJPEG は最も一般的なエンコーダーですが、別の方法で行うエンコーダーもあります。

PNG エンコーディングは一般に JPEG よりも低速です。

于 2014-03-26T04:50:37.470 に答える