比较两个bmp图像时的未知行为

时间:2013-10-03 18:56:33

标签: c algorithm image-processing

我有两个.bmp图像,每个图像有661个字节。我被跳过标题。

跳过标题后,我试图用以下代码比较两个图像。 但它没有用。

是否存在任何逻辑错误在此代码中,我试图弄清楚发生了什么,但我失败了。任何人都可以帮我弄清楚发生了什么?

#include <stdio.h>

typedef struct {
    char R,G,B;
} colorRGB;

colorRGB *RGB_buffer1, *RGB_buffer2;

void main() {
    unsigned char tmpBuf1[651],tmpBuf2[651];
    int i=0;
    int nrline;
    FILE *Img1 = fopen("sample.bmp","r");
    FILE *Img2 = fopen("sample2.bmp","r");
    int height = 256;
    int width = 256;

    fread ( tmpBuf1, 1, 651, Img1 );
    fread ( tmpBuf2, 1, 651, Img2 );

    RGB_buffer1 = (colorRGB *) malloc (3 * width * height) ;
    RGB_buffer2 = (colorRGB *) malloc (3 * width * height) ;

    for ( nrline = 0; nrline < height; nrline++ ) {
        fread( RGB_buffer1 + nrline * width, 1, width * 3, Img1 );
        fread( RGB_buffer2 + nrline * width, 1, width * 3, Img2 );
    }
    fclose (Img1);
    fclose (Img2);

    for( i = 0; i < height; i++ )
        if( (RGB_buffer1[i].R != RGB_buffer2[i].R) && 
            (RGB_buffer1[i].G != RGB_buffer2[i].G) && 
            (RGB_buffer1[i].B != RGB_buffer2[i].B)  ) break;
    if ( i == height )
        printf ( "Images are same\n" );
    free (RGB_buffer1);
    free (RGB_buffer2);
}  

1 个答案:

答案 0 :(得分:1)

我没有看得太近,但这里有一些我可以立即发现的问题。首先,如果像素中的任何颜色字节不同,则应指示图像不同。换句话说,改变&amp;&amp; (和)运营商到|| (或)在你的for循环中:

for( i = 0; i < height; i++ )
    if( (RGB_buffer1[i].R != RGB_buffer2[i].R) || 
        (RGB_buffer1[i].G != RGB_buffer2[i].G) || 
        (RGB_buffer1[i].B != RGB_buffer2[i].B)  ) break;

此外,您只检查图像的第一个高度像素,但位图中有 height x width 像素。因此,检查位图的代码应该修改为

for( i = 0; i < height*weight; i++ )
    if( (RGB_buffer1[i].R != RGB_buffer2[i].R) || 
        (RGB_buffer1[i].G != RGB_buffer2[i].G) || 
        (RGB_buffer1[i].B != RGB_buffer2[i].B)  ) break;
if ( i == height*weight )
    printf ( "Images are same\n" );