【问题标题】:How to use TYPE_BYTE_GRAY to efficiently create a grayscale bufferedimage using AWT如何使用 TYPE_BYTE_GRAY 使用 AWT 高效地创建灰度缓冲图像
【发布时间】:2011-03-07 13:59:40
【问题描述】:

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

【问题讨论】:

    标签: java awt bufferedimage


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我确实找到了如何创建一个灰色缓冲图像并让它工作并将大部分代码放入一个方法中。我的程序现在很像你的程序,只是我不读取 JPEG 文件。我看到paint被调用了两次,这正常吗?
    • @shellback3:该示例读取 JPEG,但您的代码直接从原始数据构造了 BufferedImage。我没有看到任何paint() 方法;您可以编辑您的问题以显示其他代码。
    • 谢谢,我想出了办法——paint() 在别处。 (现在学习如何将一个短的打印为无符号的短 - 它永远不会结束)。我将直接从设备(或保存在文件中)获取我的数据作为字节序列,可能在字节缓冲区中。
    • 使用图标的相关示例显示为here
    【解决方案2】:

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

    【讨论】:

    • 谢谢,这看起来与我最终找到的相似,但我已经有一段时间没有查看该代码了。
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2015-10-26
    • 2017-08-08
    • 1970-01-01
    相关资源
    最近更新 更多