代码之家  ›  专栏  ›  技术社区  ›  Nate Lockwood

如何使用类型\u BYTE \u GRAY使用AWT高效地创建灰度缓冲图像

  •  2
  • Nate Lockwood  · 技术社区  · 14 年前

    我需要从nio ShortBuffer中的数据创建一个灰度图像。我有一个函数,它将ShortBuffer中的数据映射到无符号字节,但它的格式是int(很容易更改)。我发现的方法使用的是RGB加透明度的颜色模型,看起来效率很低。我还没有看到如何应用类型\u BYTE \u GRAY并修改代码。我是爪哇新手。这是我的密码:

        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);
    }
    

    短暂性脑缺血发作

    2 回复  |  直到 14 年前
        1
  •  4
  •   trashgod    14 年前

    一种方法是创建 BufferedImage 通过像现在这样写入光栅。一旦你有了 缓冲图像 TYPE_BYTE_GRAY 使用 filter() 方法 ColorConvertOp ,如图所示 example

        2
  •  4
  •   Clayton Louden    12 年前

    代替使用 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;
    }
    

    伟大的导师(包括如何使用 GrayFilter )可在此处找到: http://www.tutorialized.com/tutorial/Convert-a-Color-Image-to-a-Gray-Scale-Image-in-Java/33347