ここでの問題はsetRGB()
、0xRRGGBB カラー値が必要なことです。BufferedImage は、データがどのような形式で保存されているかに関係なく、画像が RGB であるかのように見せかけます。DataBufferShort
実際には( を使用して)内部getTile(0, 0).getDataBuffer()
にアクセスできますが、どのように配置されているかを理解するのは難しい場合があります。
ピクセルが既に にある場合short[]
、より簡単な解決策は、それらを にコピーするint[]
代わりににコピーすることMemoryImageSource
です。
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));
このアプローチの利点は、基になるピクセル配列を制御できることです。その配列に変更を加えて を呼び出すと、ライブで更新さnewPixels()
れます。MemoryImageSource
また、グレースケール以外の独自のパレットを定義する完全な機能も提供します。
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);