1

Javaでの画像処理初心者です。2 つの画像を以下のコードと比較しようとしていますが、コードに続くメッセージが表示されます。どんな助けでも大歓迎です。ありがとう。

    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)
4

2 に答える 2

1

@Nathan Villaescusaが言ったように、使用している方法は単一のチャネルを期待しています。バイト配列またはカラーチャネルが必要ですか? 色コンポーネントのみが必要な場合は、次のことができます。

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 およびアルファ コンポーネントを取得できます。

int a = rgb >> 32 & 0xff;
int r = rgb >> 16 & 0xff;
int g = rgb >> 8 & 0xff;
int b = rgb & 0xff;
于 2012-11-09T15:24:21.053 に答える
0

複数のコンポーネントがあるため、エラーがスローされているように見えますColorSpaceが、チェックする値を 1 つしか渡していません。

を受け入れるメソッドではなく、getGreen()を受け入れる ColorComponentModelのメソッドを使用します。を受け入れる方法は、グレースケールで使用するためのものだと思います。Objectintint

この回答によると、このメソッドを使用してピクセルデータを取得する方法は次のとおりです。

Raster r = imgOrig.getData();    
SampleModel sm = r.getSampleModel();
int width = sm.getWidth();
int height = sm.getHeight();
for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
        Object pixel = sm.getPixel(x, u, (int[])null, r.getDataBuffer());        
        System.out.println(cmImgOrig.getGreen(pixel));
    }
}
于 2012-11-08T05:29:35.190 に答える