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

标签 java awt bufferedimage

我需要根据 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 内特

最佳答案

代替使用 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() 方法相比,这应该执行得更快,并提供更好的结果。

一个很棒的教程(包括如何使用 GrayFilter 的说明)可以在这里找到:http://www.tutorialized.com/tutorial/Convert-a-Color-Image-to-a-Gray-Scale-Image-in-Java/33347

关于java - 如何使用 TYPE_BYTE_GRAY 使用 AWT 高效创建灰度缓冲图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3106269/

相关文章:

java - 继承和私有(private)变量

Javassist:将 CtMethod 转换为 java.lang.reflect.Method

java - Jedis 作为消息队列的表现

java - 拖放后移动组件

java - 拾取点的 WorldWind 颜色

java - 在 J2ME 中使用 BufferedImage

java - 使用oracle jdbc连接时如何获取数据库模式名称?

java - 在 GUI map Java 上平移

java - 从 BufferedImage 到文件 : Return Type issues

java - 如何提高 Java 语言中 ComponentColorModel 创建的 BufferedImage 的绘制性能?