2010-06-23 80 views
2

我需要从nio ShortBuffer中的数据创建灰度图像。我有一个函数将ShortBuffer中的数据映射到无符号字节,但是它是一个int(很容易更改)。我发现的方法使用RGB加透明度颜色模型,看起来相当不合适。我一直无法看到如何应用TYPE_BYTE_GRAY并修改代码。我是Java新手。这里是我的代码:如何使用TYPE_BYTE_GRAY使用AWT高效创建灰度bufferedimage

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 内特

回答

3

一种方法是通过写光栅,你现在做创建BufferedImage。一旦你有了BufferedImage,你可以使用filter()方法ColorConvertOp将其转换为TYPE_BYTE_GRAY,如example所示。

+0

谢谢,我没有找到如何创建一个灰色的BufferedImage,并得到它的工作,并把大部分的代码在油漆在一个方法中。现在我的程序与您的程序非常相似,只是我没有读取JPEG文件。我看到油漆被调用两次,这是正常的吗? – 2010-06-25 17:40:24

+0

@ shellback3:该示例读取JPEG,但代码直接从原始数据构建“BufferedImage”。我没有看到任何'paint()'方法;您可以编辑您的问题以显示其他代码。 – trashgod 2010-06-25 18:48:57

+0

谢谢,我想出了如何做到这一点 - 油漆()在别处。 (现在要学习如何打印短符号作为无符号短符号 - 它永远不会结束)。我将直接从设备中获取数据(或保存在文件中)作为字节序列,可能在字节缓冲区中。 – 2010-06-30 21:43:08

4

使用ColorConvertOp的insted的,你可以简单地创建一个新的灰度等级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; 
} 

这应该显著更快地执行,也比使用过滤器提供更好的结果()方法。

一个伟大的tuturial(包括如何使用GrayFilter指令)可以在这里找到:http://www.tutorialized.com/tutorial/Convert-a-Color-Image-to-a-Gray-Scale-Image-in-Java/33347

+0

谢谢,这看起来与我终于找到的类似,但我还没有看过一段时间的代码。 – 2012-10-12 22:43:19