Java缓冲区图像灰度降级

Java缓冲区图像灰度降级,java,bufferedimage,grayscale,Java,Bufferedimage,Grayscale,我正在创建一个简单的程序,它接受一个灰度图像作为输入,我只想检索每个像素的颜色信息,将其存储在我称之为PixelClass的对象数组中。最终目标只是使用所述获取的颜色信息将图像重新绘制为新的BuffereImage 用于从给定图像创建像素阵列的代码 public static PixelClass[][] getPixelArray(BufferedImage bi){ int height = bi.getHeight(); int width = bi.getWidt

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

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

    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;
}
publicstaticpixelclass[]getPixelArray(BufferedImage-bi){
int height=bi.getHeight();
int width=bi.getWidth();
PixelClass[][]pixelArray=新的PixelClass[高度][宽度];
对于(int i=0;i
用于尝试使用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);
}
public void paintopanel(PixelClass[]pc,int-height,int-width){
BuffereImage nbi=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
对于(int i=0;i
链接到原始图像


正如您所看到的,图像质量明显下降。生成的图像似乎已褪色。

我建议您使用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);

您只提供了一个指向一个图像的链接,我假设这是目标图像。当你没有什么可比的时候,很难看到任何可能的退化:)而且,如果你是专门使用灰度图像,你可以考虑使用<代码> BuffeReimigy.Type yByTeTeGey @ Yuno:我不知道,但是我能告诉你的是GeTrgB..(/StRGBb)不做大多数人认为它所做的。get/setRGB根据颜色模型修改像素值,这些值根据您的OS/JVM/monitor/任何东西而有所不同。如果您想获取/设置像素,而不让JAVA以一种很难预测的方式修改像素,那么您需要直接使用底层int[]数据缓冲区(当然,这只适用于某种类型的BuffereImage)。作为奖励,使用int[]而不是set/getRGB可以快100倍(在OS X 10.4上测量)。我感觉这可能与颜色模型有关。能否检索颜色模型并将其设置在新图像上以进行维护?虽然,正如你所说,直接操作像素可能更快。我如何操作这个所谓的底层int[]数据缓冲区@D.N,我尝试过将图像类型设置为type_byte_gray,但仍然没有任何效果,问题是,使用相同的代码,当使用的图像不是灰度时,不会出现褪色效果。