3

BufferedImage.TYPE_USHORT_GRAYを使用して16ビットのグレースケール画像データをpngに書き込もうとしています。通常、私は次のように画像に書き込みます。

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

それから:

image.setRGB(x,y,Color.getRGB);

ピクセルを設定し、最後に:

ImageIO.write(image, "png", new File(path + ".png"));

png画像に書き込む。

しかし今、私はこれを画像として持っています:

BufferedImage imageGray = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY);

ピクセルをそのフォーマットに保存するにはどうすればよいですか?16ビット整数でsetRGB()を使用すると、機能しないようです。保存したpngファイルを開くと、多くのバンディングが発生していることがわかります。

0から65535までの単純なグラデーションを保存してから、グレースケール画像でsetRGB()を使用して、Photoshopで結果を確認しました。画像は256行ごとの小さなグラデーションで構成されていることがわかります。setRGB()またはimageIOのいずれかが希望どおりに機能しないと思います。

これに対する回避策はありますか?imageIOはBufferedImage.TYPE_USHORT_GRAY形式もサポートしていますか?それとも、8ビットデータしか保存できませんか?そして、16ビットデータを保存できる場合、できればsetRGB()が機能するように(特定のx、y座標に対して)ピクセルデータを保存するにはどうすればよいですか?

4

3 に答える 3

2

pstが私の質問の下にすでにコメントしているように:

ラスターを直接使用してみますか?

ラスターにアクセスすると、問題が直接解決されました。

BufferedImage bi = BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY)
for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
        Short s = shortData[x][y]
        bi.getRaster().setDataElements(x, y, Short[] {s})
    }
}
于 2011-02-15T20:04:03.540 に答える
0

BufferedImageあなたから読むことができます

public static final int TYPE_USHORT_GRAY

符号なしの短いグレースケール画像、インデックスなしを表します)。この画像には、CS_GRAYColorSpaceを持つComponentColorModelがあります。

ColorSpaceだから、CS_GRAYタイプであなた自身をインスタンス化してみてください(ColorSpace.getInstance(ColorSpace.CS_GRAY)私が思うにそれをするべきです)。このオブジェクトには、fromRGB使用できるはずのメソッドがあります...

于 2010-11-07T08:17:54.913 に答える
0

おそらく、署名された16ビットショーツをintに広げて、記号を削除する必要があります。

int ushort = (int)(shortData[x][y]) & 0xFFFF;
于 2010-11-07T10:01:49.073 に答える