ここで問題となるのは、setRGB()
は0xRRGGBBのカラー値が必要です。 BufferedImageは、データが格納されているかどうかにかかわらず、イメージがRGBであるとふりをするのが好きです。あなたは実際に内部DataBufferShort
(getTile(0, 0).getDataBuffer()
)に行くことができますが、それがどのようにレイアウトされているか把握するのは難しいことがあります。
すでにshort[]
であなたのピクセルを持っている場合は、簡単な解決策はMemoryImageSource
にジャムに代わりint[]
にそれをそれらをコピーすることがあります
int[] buffer = /* pixels */;
ColorModel model = new ComponentColorModel(
ColorSpace.getInstance(ColorSpace.CS_GRAY), new int[] { 16 },
false, true, Transparency.OPAQUE, DataBuffer.TYPE_USHORT);
Image image = Toolkit.getDefaultToolkit().createImage(
new MemoryImageSource(VERTICAL_PIXELS, HORIZONTAL_PIXELS,
model, buffer, 0, VERTICAL_PIXELS));
このアプローチの利点は、あなたがコントロールするということです下にある画素アレイ。その配列に変更を加えて、MemoryImageSource
にnewPixels()
と電話すると、ライブが更新されます。それはまた、あなたのグレースケール以外の独自のパレットを定義するための完全な力を与える:
int[] cmap = new int[65536];
for(int i = 0; i < 65536; ++i) {
cmap[i] = (((i % 10000) * 256/10000) << 16)
| (((i % 20000) * 256/20000) << 8)
| (((i % 40000) * 256/40000) << 0);
}
ColorModel model = new IndexColorModel(16, 65536, cmap, 0, false, -1, DataBuffer.TYPE_USHORT);
あなただけの画面に画像を表示したい場合は、このアプローチはうまく動作します:
JFrame frame = new JFrame();
frame.getContentPane().add(new JLabel(new ImageIcon(image)));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
しかし、あなたが望んでいた場合ファイルに書き出し、1ピクセルあたり1つの短いフォーマットを保持する(Matlabにロードするなど)場合、あなたは不運になります。あなたができることは、BufferedImage
にペイントし、ImageIO
でそれを保存することです。これはRGBとして保存されます。
あなたは間違いなく最後にBufferedImage
が必要な場合は、別のアプローチは、自分でパレットの色を適用するRGB値を計算し、イメージにコピーすることです。この例が示すように、
short[] data = /* your data */;
int[] cmap = /* as above */;
int[] rgb = new int[data.length];
for(int i = i; i < rgb.length; ++i) {
rgb[i] = cmap[data[i]];
}
BufferedImage image = new BufferedImage(
VERTICAL_PIXELS, HORIZONTAL_PIXELS,
BufferedImage.TYPE_INT_RGB);
image.setRGB(0, 0, VERTICAL_PIXELS, HORIZONTAL_PIXELS,
pixels, 0, VERTICAL_PIXELS);
私はその後、私の描画コードはどこにでもArrayOutOfBoundsの例外を除いてFUBARで実現、ということでした。それを見ると、うまくいくようです。私がやる必要があるのは、(うまくいけば)うまくいった.pngとして出力することだけです。これは問題ないと思われるので、これを正しいとマークします。 –
これは、画像にピクセルを配置するとき、左から始まり、上から始まる右または水平に向かう垂直線で描画しますか?私の部分的に動作するコードは、時計回りに90度回転した画像を持っているので、私はそれが描画の失敗だとは思わない。 –
心配しないで!私はMemoryImageSource部分の200をHORIZONTAL_PIXELSに変更しなければなりませんでした。ありがとう、ありがとう! –