0

我需要一些关于 Java 的 ImageIO API 的帮助。我似乎迷失在 ComponentColorModel 类中。我需要逐像素检查 *.png 文件以检测它是灰度图像还是彩色图像。但是,我不知道如何获得每个像素的 R、G、B 值。任何人都可以帮忙吗?

以下代码在“m.getComponents(i, components, 0);”行上时抛出 IllegalArgumentException

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;
      }
   }
4

3 回答 3

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;
   }
}
于 2012-09-05T09:54:10.677 回答
1

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

于 2012-09-04T13:11:03.740 回答
0

组件模型定义:

public int getRGB(int pixel);
public int getRed(int pixel);
public int getGreen(int pixel);
public int getBlue(int pixel);
于 2012-09-04T11:51:40.307 回答