2014-02-10 37 views
0

我想提取圖像像素的R,G和B值。我以兩種方式做到這一點。從ColorModel獲取RGB分量

File img_file = new File("../foo.png"); 
BufferedImage img = ImageIO.read(img_file); 

一號方法(正常工作):

img.getRaster().getPixel(i, j, rgb); 

第二個方法(拋出新的拋出:IllegalArgumentException( 「每像素的多個組件」))

red = img.getColorModel().getRed(img.getRGB(i, j)); 

什麼這種行爲的原因?

回答

1

通常當我想從BufferedImage提取RGB我做這樣的事情:

File img_file = new File("../foo.png"); 
BufferedImage img = ImageIO.read(img_file); 

Color color = new Color(img.getRGB(i,j)); 
int red = color.getRed(); 
0

基礎上JavaDocs

,則拋出如果此 ColorModel的像素值不可方便地表示爲單個int

它窩ULD表明,下層顏色模型是由單一int

您可能還需要看一看this answer的一些細節

通常表示的,你會簡單地採取從圖像中int包裝像素使用Color生成一個Color表示,然後從那裏提取值...

首先,獲得在x/y像素的int包裝的價值...

int pixel = img.getRGB(i, j); 

使用此構建Color對象...

Color color = new Color(pixel, true); // True if you care about the alpha value... 

提取R,G,B值...

int red = color.getRed(); 
int green = color.getGreen(); 
int blue = color.getBlue(); 

現在,你可以簡單地做一些位數學,但這是更簡單,更可讀 - 恕我直言

+0

感謝您的答覆。但是如何確定顏色模型是否可以由單個int值表示? – Rayhunter

+1

就我個人而言,我會檢查它是'instanceof' ComponentColorModel',IndexColorModel'還是'PackedColorModel',但是你也可以測試getNumColorComponents,getNumComponents和getPixelSize是什麼返回... – MadProgrammer

+0

@Rayhunter,'BufferedImage'只支持最多32位的類型,因此所有像素都可以放入Java int中(參見支持的類型http://docs.oracle.com/javase/7/docs/api/java/awt/image /BufferedImage.html#TYPE_3BYTE_BGR) – Jason