4

ディスクから読み込まれた画像 ( として保存されますBufferedImage) があり、これは正しく表示されますJPanelが、以下のコマンドを使用してこの画像を再保存しようとすると、画像が赤みを帯びた色合いで保存されます。

ImageIO.write(image, "jpg", fileName);

ノート!image は、BufferedImage保存されるファイル名を指すオブジェクトで、" " で終わりfileNameます。File.jpg

以前の JDK のメソッドに問題があったことを読みましたがImageIO、私が見つけた限り、それらのバージョンのいずれにも属していません。私が探しているのは、JDKを更新せずにこの問題を修正する方法ですが、この問題がどのJDKで修正されたかを知りたいと言っていました(実際に私が使用しているJDKのバグである場合) )。

ありがとう。

4

3 に答える 3

5

OK、問題を解決しました。何らかの理由で画像を BufferedImage.TYPE_INT_RGB に変換する必要があるようです。一部のレイヤーでアルファチャンネルが正しく処理されていない可能性があると思います。

于 2010-05-02T18:04:46.480 に答える
3

まず、問題が BifferedImage カラー モデルなのか、それとも jpeg エンコーディングなのかを調査することから始めます。画像タイプ (コンストラクターの 3 番目の引数) を変更して違いが生じるかどうかを確認し、JPEGCodec を直接使用して jpeg を保存することもできます。

例えば

 BufferedImage bufferedImage = ...;  // your image
 out = new FileOutputStream ( filename );
 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder ( out );
 JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam ( bufferedImage );
 encoder.setJPEGEncodeParam ( param );
 encoder.encode ( bufferedImage );
 out.close();

編集:テキストを変更しました。変更したい画像タイプです。コンストラクタへのリンクを参照してください。

于 2010-05-02T14:26:58.713 に答える
1

別のアプローチは、TYPE_INT_ARGB以下に概説し、ここで提案するように、アルファ付きの DirectColorModel を持つバッファーで画像をレンダリングすることです。

private BufferedImage process(BufferedImage old) {
    int w = old.getWidth();
    int h = old.getHeight();
    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = img.createGraphics();
    g2d.drawImage(old, 0, 0, null);
    g2d.dispose();
    return img;
}
于 2010-05-02T15:43:27.003 に答える