我需要根据nio ShortBuffer中的数据创建灰度图像。我有一个函数将ShortBuffer中的数据映射到无符号字节但是在int中(很容易更改)。我发现的方法使用RGB加透明色模型,看起来非常无效。我无法看到如何应用TYPE_BYTE_GRAY并修改代码。我是Java的新手。这是我的代码:
public void paintComponent(Graphics g) {
final BufferedImage image;
int[] iArray = {0, 0, 0, 255}; // pixel
image = (BufferedImage) createImage(WIDTH, HEIGHT);
WritableRaster raster = image.getRaster();
sBuf.rewind(); // nio ShortBuffer
for (int row = 0; row < HEIGHT; row++) {
for (int col = 0; col < WIDTH; col++) {
int v = stats.mapPix(sBuf.get()); // map short to byte
iArray[0] = v; // RGBT
iArray[1] = v;
iArray[2] = v;
raster.setPixel(col, row, iArray);
}
}
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
}
TIA 内特
答案 0 :(得分:4)
使用ColorConvertOp时,只需创建一个新的灰度BufferedImage并将原始彩色图像绘制到其上:
public static BufferedImage convertToGrayScale(BufferedImage image) {
BufferedImage result = new BufferedImage(
image.getWidth(),
image.getHeight(),
BufferedImage.TYPE_BYTE_GRAY);
Graphics g = result.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return result;
}
与使用filter()方法相比,它的执行速度要快得多,效果也会更好。
这里有一个很棒的tuturial(包括如何使用GrayFilter的说明):http://www.tutorialized.com/tutorial/Convert-a-Color-Image-to-a-Gray-Scale-Image-in-Java/33347
答案 1 :(得分:3)
一种方法是通过写入光栅来创建BufferedImage
,就像现在一样。获得BufferedImage
后,您可以使用filter()
的ColorConvertOp
方法将其转换为TYPE_BYTE_GRAY
,如example所示。