10

特定のJPGファイルを読み取ると、色が平坦になります。これは、jpgを読み取り、同じ画像を別のファイルに書き込む簡単な例です。

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class JPegReadTest {
    public static void main(String[] args) {
        if (args.length == 2) {
            try {
                BufferedImage src = ImageIO.read(new File(args[0]));
                ImageIO.write(src, "jpg", new File(args[1]));
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.err.println("Usage: java JPegReadTest src dest");
        }
    }
}

たとえばhttp://www.flickr.com/photos/visualpanic/233508614/sizes/l/でこれを試してみると、宛先画像の色がソースファイルと異なります。何故ですか?それを修正する方法は?

また、画像をpngとして保存しようとしましたが、色も淡いです(したがって、色情報が正しく読み取られていないと想定しています)。

4

5 に答える 5

10

それはいくつかの理由である可能性があります。

  1. JPEGカラーデータは、RGBではなくYCrCbとして保存されることがよくありますが、変換はほとんど目立たないはずです。
  2. JPEGにはカラープロファイルが埋め込まれていることがよくありますが、多くのアプリケーションはこれを理解せず、単に無視します(この場合、出力ファイルにカラープロファイルがない可能性があります)。
  3. ガンマ値は、Javaがマングルした後、リセットまたは欠落する可能性があります。

私は実際にあなたの例を試しませんでした...ファイルの前後の両方に投稿していただけませんか?結果ファイルを実際に調べることができなければ、この余分なデータが存在するかどうかを判断するのは困難です。

編集:ええ、元の画像と変換された画像のカラープロファイルが異なることは明らかです。Javaはオリジナルのカラープロファイルを取り除き、代わりに汎用のsRGBを使用しました。これらのプログラムはレンダラーのときにカラープロファイルを使用しないため、Firefoxを使用するWindowsやさまざまなプログラムでは同じように見えます。ただし、Macでは、Macは実際にはこれらのカラープロファイルをサポートしているため(グラフィックスなどのMacに関するキュー討論)、レンダリングが異なります。私はMacを持っていませんが、どのプラットフォームでもPhotoshopでファイルを開くと、違いがわかると思います。

于 2009-08-13T12:44:50.383 に答える
2

おそらく、ソース画像にsRGBよりも広い色域(Adobe RGBなど)のカラープロファイルが割り当てられており、ロード/保存サイクルで色空間情報が保持されていませんか?カラープロファイルがない場合、ビューアはsRGBを想定し、圧縮された色域によってすべてが「何となく」見えるようになります。exiftoolをお持ちの場合は、

exiftool -ProfileDescription filename.jpg

ソース画像と出力画像のカラープロファイルを確認する簡単な方法です。

于 2009-08-13T14:15:33.950 に答える
0

jpegは不可逆形式です。読み込まれると、JavaはBMPのように生の形式として保存します。その後、再び書き出され、データが失われます。また、GIMPのようなものを使用する場合のように、品質をあまり制御することはできません。

たぶん、 Image Magickのような他のAPIを使用して、品質をより細かく制御できるようにすることを検討してください。

于 2009-08-13T12:45:31.430 に答える
0

JPEG不可逆形式です。

つまり、ファイルを開いて再度保存すると、情報を失わないように非常に具体的な手順を実行しない限り、一部の情報が失われます(この場合、可能な操作は非常に制限されます)。

さらにImageIO.write()、おそらくJPEGファイルを保存するためにいくつかのデフォルトの品質設定を使用しますが、これは元のファイルよりも低い可能性があり、品質がさらに低下する可能性があります。

PNGファイルに保存してみると、ソースと同じように見えることがわかります。

于 2009-08-13T12:47:23.840 に答える
0

これは、ImageIOインターフェイスを拡張したソースコードへのリンクです。画像を書き込むときに品質と圧縮のパラメータを変更できます。... http://www.universalwebservices.net/web-programming-resources/java/adjust- jpeg-image-compression-quality-when-saving-images-in-java

于 2013-01-18T00:29:44.493 に答える