2011-01-21 34 views
2

我正在創建一個簡單的程序,它接受一個灰度圖像作爲輸入,我只是想要做的是檢索每個像素的顏色信息,將其存儲在我稱爲PixelClass的對象數組中。最終目標僅僅是使用所述獲取的顏色信息將圖像重新繪製成新的BufferedImage。Java 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

正如你可以看到有顯著圖像質量下降。生成的圖像顯得褪色。

+0

您只提供一個圖像的鏈接,我認爲它是目標圖像。當你沒有任何東西可以比較時,很難看出任何可能的降級:) – 2011-01-21 14:49:08

回答

1

我建議你使用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);