2014-09-22 37 views
-1

我需要從我生成的值寫入灰色圖像。這是我使用的一段代碼,但我使它簡單。setRGB和imageIO.write後意外的像素值變化

BufferedImage test = new BufferedImage(1,1,BufferedImage.TYPE_BYTE_GRAY); 
int rgb =(3 & 0xff) << 16 | (3 & 0xff) << 8 | (3 & 0xff); 
test.setRGB(0, 0, rgb); 
ImageIO.write(test, "png", new File("/home/harris/cipher.png")); 

此代碼將生成一個像素的圖像。像素值應該是3,但我得到了0。這段代碼有什麼問題?

回答

1

這裏有一些事情正在進行。首先,您試圖爲1個字節的像素設置3字節的顏色。像素的顏色深度由TYPE_BYTE_GRAY指示。如果您使用TYPE_INT_RGB代替,則代碼將按寫入方式工作,但不會生成灰度圖像。

如果你真的想要一個灰度圖像,那麼你應該保持TYPE_BYTE_GRAY。然而,不能操縱像素作爲RGB,所以可以提取WriteableRaster和操縱該如下:

WritableRaster raster = test.getRaster(); 

int [] gray = new int[1]; 
gray[0] = 3; 
raster.setPixel(0, 0, gray); 

當作爲PNG編碼,這個例子實際產生爲2的像素值設置上述值爲4時,像素值爲3.但是,將其編碼爲BMP時,顏色按預期寫入。我不是一位PNG專家,但也許這是某種圖像優化?