比较两个图像是否相同

时间:2010-12-10 13:29:20

标签: android image

我知道如何比较两个字符串是否相同。这是比较两个字符串的编码 TextView t,t1;

String s,s1;
s=t.getText().toString();
s1=t1.setText().toString();
if(s.equals(s1)){
   t.setText("equal");
}
else{
   t.setText("not equal");
}

我需要编码比较两个图像是否相同。请尽早给我

3 个答案:

答案 0 :(得分:1)

检查高度是否匹配,如果不是则返回false。然后,检查宽度是否匹配,如果不匹配,则返回false。然后检查每个像素,直到找到一个不匹配的像素。当你这样做时,返回false。如果每个像素都匹配,则返回true。

伪代码

bool imagesAreEqual(Image i1, Image i2)
{
    if (i1.getHeight() != i2.getHeight) return false;
    if (i1.getWidth() != i2.getWidth) return false;

    for (int y = 0; y < i1.getHeight(); ++y)
       for (int x = 0; x < i1.getWidth(); ++x)
            if (i1.getPixel(x, y) != i2.getPixel(x, y)) return false;

    return true;
}

实际上,如果可以,您可能希望将图像视为二维数组,并且只是比较字节。我不知道Android图片API,但getPixel可能会很慢。

答案 1 :(得分:-1)

如果你想检查两个图像是否绝对相等,那么从两个图像中获取字节,并用逐个元素检查比较两个数组。

答案 2 :(得分:-1)

图像可以定义为 BufferedImage 的抽象,它只保存类似标题的信息。在读取图像像素之前,请将图像与其大小进行比较。

File f1;
File f2;
Image i1 = ImageIO.read(f1);
Image i2 = ImageIO.read(f2);
if(i1.getHeight() == i2.getHeight
    && i1.getWidth() == i2.getWİdth) {
    BufferedImage b1 = ImageIO.read(f1);
    BufferedImage b2 = ImageIO.read(f2);
    //compare pixels
}

图像的读取方式比BufferedImage更快,因为它不会从文件中获取像素。 为了比较,我建议进行两个或更多的分层像素比较。使用随机会提高你的速度,因为找到一个不匹配的像素就足够了。

for(i=0; i<N; i++) {
    x = r.nextInt(184);
    y = r.nextInt(184);
    if(b1.getRGB(x,y) != b2.getRGB(x,y)) {
        break;
    }
}

如果图像通过随机比较,则进行逐像素比较,在发现不匹配像素的情况下打破循环。我回答假设您需要快速运行比较。为此,我不建议使用MD5哈希,除非您想在大图像目录中找到所有重复的图像。如果您只想比较两个图像,并且速度快,MD5没有多大意义,因为需要读取图像的所有像素来检查哈希值,这会降低一次比较的速度。