如何使用TYPE_BYTE_GRAY使用AWT高效创建灰度缓冲图像

我需要从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 Nate

一种方法是通过像现在一样写入栅格来创建BufferedImage 。 获得BufferedImage ,可以使用ColorConvertOpfilter()方法将其转换为TYPE_BYTE_GRAY ,如本例所示。

使用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