Java BufferedImage 灰度退化

标签 java bufferedimage grayscale

我正在创建一个接受灰度图像作为输入的简单程序,我只想检索每个像素的颜色信息,将其存储在我称为 PixelClass 的对象数组中。最终目标只是使用上述获取的颜色信息将图像重新绘制为新的 BufferedImage。

用于从给定图像创建像素阵列的代码。

    public static PixelClass[][] getPixelArray(BufferedImage bi){
    int height = bi.getHeight();
    int width = bi.getWidth();
    PixelClass[][] pixelArray = new PixelClass[height][width];
    for(int i = 0 ; i < height ; i++){
        for(int j = 0 ; j < width ; j++){
            pixelArray [i] [j] = new PixelClass(bi.getRGB(j, i));
        }
    }
    return pixelArray;
}

用于尝试使用 PixelClass 对象数组重新绘制所述图像的代码

    public void paintToPanel(PixelClass [][] pc, int height, int width){
    BufferedImage nbi = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
    for ( int i = 0 ; i < height ; i++){
        for ( int j = 0 ; j < width ; j++){
            nbi.setRGB(j, i, pc[i][j].getRGBValue());
        }
    }
    JLabel containerLabel = new JLabel(new ImageIcon(nbi));
    containerLabel.setBounds(10,10,nbi.getHeight(), nbi.getWidth());
    this.add(containerLabel);
}

原始图片链接

http://sphotos.ak.fbcdn.net/hphotos-ak-snc4/hs1364.snc4/163667_172099429501181_100001033756527_413302_3062182_n.jpg

如您所见,图像质量明显下降。生成的图像似乎褪色了。

最佳答案

我建议您使用 MemoryImageSource 类。像这样的东西:

byte[] pixels = // your pixels
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); 
int bits[] = new int[] {8};

ColorModel cm = new ComponentColorModel(cs, bits, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);

MemoryImageSource mis = new MemoryImageSource(width, height, cm, pixels, 0, width);

Image im = Toolkit.getDefaultToolkit().createImage(mis);

关于Java BufferedImage 灰度退化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4760088/

相关文章:

java - astar 的启发式函数

java - 使用字节数组设置 BufferedImage 的像素颜色

java - 在java中显示灰度图像

java - Java是跨平台的吗?

java - 在ListView中加载多个布局

java - 在 verticle vert.x 中实例化类的危险

java - JFrame 上的 String 和 BufferedImage

java - 如何使用java识别空白/不可见图像

java - iText:将现有 PDF 的颜色更改为灰度

ios - 以灰度绘制 UIView?