我有两个.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);
}
答案 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" );