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

Java 如何使用TYPE_BYTE_GRAY使用AWT高效地创建灰度缓冲区图像,java,awt,bufferedimage,Java,Awt,Bufferedimage,我需要从nio ShortBuffer中的数据创建灰度图像。我有一个函数,它将ShortBuffer中的数据映射到无符号字节,但它的值是int(很容易更改)。我发现的方法使用的是RGB加透明度的颜色模型,效率很低。我还没有看到如何应用类型_BYTE _GRAY并修改代码。我是Java新手。这是我的密码: public void paintComponent(Graphics g) { final BufferedImage image; int[] iArray = {0

我需要从nio ShortBuffer中的数据创建灰度图像。我有一个函数,它将ShortBuffer中的数据映射到无符号字节,但它的值是int(很容易更改)。我发现的方法使用的是RGB加透明度的颜色模型,效率很低。我还没有看到如何应用类型_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);
}
公共组件(图形g){
最终缓冲图像;
int[]iArray={0,0,0,255};//像素
image=(buffereImage)createImage(宽度、高度);
WritableRaster raster=image.getRaster();
sBuf.rewind();//nio ShortBuffer
对于(int row=0;row
短暂性脑缺血发作
Nate

一种方法是像现在这样通过写入光栅来创建。获得后,您可以使用的方法将其转换为
TYPE\u BYTE\u GRAY
,如下所示。

除了使用,您只需创建一个新的灰度并在其上绘制原始彩色图像:

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()方法相比,该方法的执行速度要快得多,并提供更好的结果


在这里可以找到一个很好的教程(包括关于如何使用A的说明):

谢谢,我确实找到了如何创建灰色缓冲区图像的方法,并使其正常工作,并将大部分代码以一种方法绘制。我的程序现在和你的非常相似,只是我不读取JPEG文件。我看到paint被调用了两次,这正常吗?@shellback3:示例读取一个JPEG,但您的代码直接从原始数据构建一个
BufferedImage
。我没有看到任何
paint()
方法;您可以编辑您的问题以显示其他代码。谢谢,我知道了如何做到这一点-paint()在别处。(现在学习如何将短文打印为未签名短文-它永远不会结束)。我将直接从设备(或保存在文件中)以字节序列的形式获取数据,可能是字节缓冲。下面显示了一个使用图标的相关示例。谢谢,这与我最终发现的内容类似,但我已经有一段时间没有看过该代码了。