java.lang.IllegalArgumentException : More than one component per pixel

标签 java image-processing illegalargumentexception

我是 Java 图像处理新手。我正在尝试将两个图像与下面的代码进行比较,并获取代码后面的消息。任何帮助是极大的赞赏。谢谢。

    BufferedImage imgOrig = ImageIO.read(new URL(imgOrigUrl));
    BufferedImage imgComp = ImageIO.read(new URL(imgCompUrl));                

    byte[] pixelsOrig = ((DataBufferByte) imgOrig.getRaster().getDataBuffer()).getData();
    byte[] pixelsComp = ((DataBufferByte) imgComp.getRaster().getDataBuffer()).getData();

    //System.out.println("Number of pixels orig:"+pixelsOrig.length);
    //System.out.println("Number of pixels comp:"+pixelsComp.length);

    ColorModel cmImgOrig = imgOrig.getColorModel();
    ColorModel cmImgComp = imgComp.getColorModel();

    int sum1 = 0;
    int sum2 = 0;
    for(int i:pixelsOrig){
        System.out.println(cmImgOrig.getGreen(i));  //ERROR OCCURS HERE
        //System.out.println(i);
    }

错误:

Testcase: testCompareImages(com.myapp.img.compare.service.CompareServiceTest):  Caused an ERROR
More than one component per pixel
java.lang.IllegalArgumentException: More than one component per pixel
    at java.awt.image.ComponentColorModel.getRGBComponent(ComponentColorModel.java:594)
    at java.awt.image.ComponentColorModel.getGreen(ComponentColorModel.java:675)
    at com.scottmacri.img.compare.service.CompareService.compareImages(CompareService.java:42)
    at com.scottmacri.img.compare.service.CompareServiceTest.testCompareImages(CompareServiceTest.java:45)

最佳答案

就像@Nathan Villaescusa 所说,您使用的方法期望单个 channel 。您需要字节数组还是颜色 channel ?如果您只需要颜色分量,您可以执行以下操作:

BufferedImage imgOrig = ImageIO.read(new URL(imgOrigUrl));
BufferedImage imgComp = ImageIO.read(new URL(imgCompUrl));

for (int y = 0; y < imgOrig.getHeight(); y++)
{
   for (int x = 0; x < imgOrig.getWidth(); x++)
   {
      System.out.println(imgOrig.getRGB(x, y) >> 8 & 0xff);
   }
}

其中 getRGB(x, y) 返回的 int 可以移位以获得 RGB 和 alpha 分量,如下所示:

int a = rgb >> 32 & 0xff;
int r = rgb >> 16 & 0xff;
int g = rgb >> 8 & 0xff;
int b = rgb & 0xff;

关于java.lang.IllegalArgumentException : More than one component per pixel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13282366/

相关文章:

java - 为什么 Process.waitfor 不返回?

java.lang.IndexOutOfBoundsException : setSpan (118 . .. 119) 结束超过长度 118

c# - 在 C# 中提取 2 个图像之间的差异

javascript - 将图像(或位图)转换为二维矩阵

java - Field.set 抛出 IllegalArgumentException

java.lang.IllegalArgumentException : Cannot set to com. sun.proxy.$代理

java - 在 Joda 中将毫秒转换为日期时间格式时出现解析错误

java - 访问最终字段时出现奇怪的 NullPointerException

java - Java中的继承和多态

python - 如何检测图像之间的偏移