2012-09-04 39 views
0

我需要对Java的ImageIO API有所帮助。我似乎迷失在ComponentColorModel类中。我需要逐个像素检查* .png文件来检测,无论是灰度还是彩色图像。但是,我不知道如何获得每个像素的R,G,B值。谁能帮忙?从ComponentColorModel获取RGB组件

以下代码将引发IllegalArgumentException,因为它在行“m.getComponents(i,components,0);”

ComponentColorModel m = (ComponentColorModel) imageTypeSpecifier.getColorModel(); 
    int pixels = reader.getWidth(0) * reader.getHeight(0); 
    isGray = true; 

    int[] components = new int[4]; 
    for (int i = 0; i < pixels; i++) { 
     m.getComponents(i, components, 0); 
     if (!(components[0] != components[1] || components[1] != components[2])) { 
     isGray = false; 
     break; 
     } 
    } 

回答

1

自己的解决方案:

BufferedImage buffImage = reader.read(0); 
WritableRaster raster = buffImage.getRaster(); 
int[] colorsInPixel = new int[4]; 
isColor = false; 

// check all pixels one by one 
for (int i = 0; i < reader.getWidth(0) * reader.getHeight(0); i++) { 
    raster.getPixel(i % reader.getWidth(0), i/reader.getHeight(0), colorsInPixel); 
    if (colorsInPixel[0] != colorsInPixel[1] || colorsInPixel[1] != colorsInPixel[2]) { 
     isColor = true; 
    } 
} 
0

组件模型定义:

public int getRGB(int pixel); 
public int getRed(int pixel); 
public int getGreen(int pixel); 
public int getBlue(int pixel); 
+0

这是行不通的。这些方法调用ComponentColorModel中的方法getRGBComponent(int pixel,int idx),并检查是否存在if(numComponents> 1){0}。 }' 在我的情况下,变量numComponents初始化值为3.因此,每次调用它时都会得到这个异常... –

1

当你的ImageIO加载图片时,你应该有一个BufferedImage。 BufferedImage直接提供getRGB(x,y),为什么不简单地使用它并忽略ColorModel?