0

2 つの .bmp イメージがあり、それぞれに 661 バイトのヘッダーがあります。ヘッダーをスキップしました。

ヘッダーをスキップした後、次のコードで 2 つの画像を比較しようとしています。しかし、それは機能していません。

このコードには論理エラーがありますか?何が起こっているのかを突き止めようとしましたが、失敗しました。

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

1 に答える 1

1

あまり詳しく見ていませんが、すぐに見つけられるいくつかの問題を次に示します。まず、ピクセル内のカラー バイトのいずれかが異なる場合は、画像が異なることを示す必要があります。つまり、&& (and) 演算子を || に変更します。(または) 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;

また、画像の最初の高さピクセルのみを調べていますが、ビットマップには高さ x 幅のピクセルがあります。したがって、ビットマップをチェックするコードを次のように変更する必要があります。

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" );
于 2013-10-03T19:05:02.053 に答える