bmp位图比较,求真相

密斯刘 2010-03-12 09:43:59
如果*pData1存放的是BMP1.bmp图像区域的全部数据
*pData2存放的是BMP2.bmp图像区域的全部数据
怎么对pData1和pData2进行一个一个像素的比较
(数据都已经全部是图像数据,头信息数据已经排除了)

不同的颜色用蓝色填充,做个标记

我想应该是一行一行扫描,直到扫描完整张图片,但是我不知道怎么扫。

//其实这两张图片是用同一段代码对同样大小的矩形截的图
//所以除了图像数据不一致外,其他数据应该是一致的
//不同的颜色用蓝色填充,做个标记
int i, j;
int line = (width1 * 3 + 3) / 4 * 4;
for(j = 0; j < height1; ++j)
{
for(i = 0; i < width1; ++i)
{
if(!(*(pData1 + line * j + 3 * i) == *(pData2 + line * j + 3 * i) &&
*(pData1 + line * j + 3 * i + 1) == *(pData2 + line * j + 3 * i + 1) &&
*(pData1 + line * j + 3 * i + 2) == *(pData2 + line * j + 3 * i + 2)))
{
*(pData1 + line * j + 3 * i) = 0;
*(pData1 + line * j + 3 * i) = 0;
*(pData1 + line * j + 3 * i) = 255;
}
}
}

这样扫描的结果根本不是我预期的……
求真相
...全文
277 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
密斯刘 2010-03-13
  • 打赏
  • 举报
回复
en 谢谢楼上提醒 现在问题看上去已经得以解决 不过本质上仍然存在疑惑

这是打开文件的代码:

//打开一位图
CFile file;
CFileException fe;

//打开文件
if(!file.Open("A.bmp", CFile::modeRead, &fe))
return ;

file.Read(&bmpFileHead1, sizeof(BITMAPFILEHEADER));
file.Read(&bmpInfoHead1, sizeof(BITMAPINFOHEADER));

width1 = bmpInfoHead1.biWidth;
height1 = bmpInfoHead1.biHeight;
BitSize1 = bmpFileHead1.bfSize - bmpFileHead1.bfOffBits;
pData1 = (BYTE*)new char[BitSize1];

file.Read(pData1, BitSize1);
file.Close();


再次贴上位图像素比较代码:

int i, j;
int line = (width1 * 3 + 3) / 4 * 4;
//注意看这里i的取值范围///////////////////////////////
for(i = 0; i < height1 * 1.325; ++i)
{
for(j = 0; j < width1; ++j)
{
if(!(*(pData1 + line * i + 3 * j) == *(pData2 + line * i + 3 * j) &&
*(pData1 + line * i + 3 * j + 1) == *(pData2 + line * i + 3 * j + 1) &&
*(pData1 + line * i + 3 * j + 2) == *(pData2 + line * i + 3 * j + 2)))
{
*(pData1 + line * i + 3 * j) = 0;
*(pData1 + line * i + 3 * j + 1) = 0;
*(pData1 + line * i + 3 * j + 2) = 255;
}
}
}

把范围加大,果然上面的图片部分就处理了,不过这个使我很茫然……

希望各位赐教
lion_阳 2010-03-13
  • 打赏
  • 举报
回复
12的正解
kier2 2010-03-13
  • 打赏
  • 举报
回复
觉得应该是12楼说的那个问题,有可能你的BMP图像是32位的,即:R,G,B,还有一个alpha通道,所以
int line = (width1 * 3 + 3) / 4 * 4;这句要改,后面循环里的也要相应的改下,试试吧!
副组长 2010-03-13
  • 打赏
  • 举报
回复
上面错了,应该差40
副组长 2010-03-13
  • 打赏
  • 举报
回复
看line*height1是否等于bmpFileHead1.bfSize。 一定是小,否则你越界程序会垮的。
red-fly 2010-03-13
  • 打赏
  • 举报
回复
height1 * 1.325没有道理,如果算好了line值,height1就不应该再乘上任何数字了
另外,不知道你的pData是如何声明的,无法断定是否会有问题
副组长 2010-03-13
  • 打赏
  • 举报
回复
可能不是24位真彩色图像而是32位的。再就是图像的 BITMAPINFOHEADER了里面的高度是错的,仔细查查吧。

楼上:为了保证每行字节数是4的倍数,否则图像会倾斜。
guojianxun17953 2010-03-13
  • 打赏
  • 举报
回复
int line = (width1 * 3 + 3) / 4 * 4;
这句不太明白,不了解BMP的结构。
我瞎掰的,别听我的
密斯刘 2010-03-13
  • 打赏
  • 举报
回复
谢谢各位 我对位图一点都不熟悉 照着书上写的代码 书上也没有仔细介绍
现在我懂了一点点了,那个图片是我写代码截得32位位图,我把它改成24位的就可以查找不同之处了。
问题虽然没有完全解决,单卧还是自己看看资料了
结贴
副组长 2010-03-12
  • 打赏
  • 举报
回复
BMP图像在内存里面是头朝下的,但是和这个没关系,看你的代码不应该是一半,除非你不是从头开始的。
密斯刘 2010-03-12
  • 打赏
  • 举报
回复
图片的下面一截可以实现查找 但是上面那一截却不行
难道扫描起点错了
副组长 2010-03-12
  • 打赏
  • 举报
回复
哦,是红色
副组长 2010-03-12
  • 打赏
  • 举报
回复
说说你的症状吧,通常不是完全一个来源的图像,像素值完全相同的可能性是比较小的。
是不是大部分都变成了蓝色?
密斯刘 2010-03-12
  • 打赏
  • 举报
回复
各位能否给点代码,我的想法是:
比较两张位图,把不同的地方用某种颜色突出显示
324234234134 2010-03-12
  • 打赏
  • 举报
回复
用位运算效率会高点吧。
lizhigang34 2010-03-12
  • 打赏
  • 举报
回复
既然是逐个像素的比较,那就没必要比较位图的数据了,直接把位图加载到内存,然后用GetPixel()来比较像素点的颜色就好了啊。
密斯刘 2010-03-12
  • 打赏
  • 举报
回复

*(pData1 + line * j + 3 * i) = 0;
*(pData1 + line * j + 3 * i + 1) = 0;
*(pData1 + line * j + 3 * i + 2) = 255;


还是没有预期效果 应该是我的比较方法错了
kier2 2010-03-12
  • 打赏
  • 举报
回复
*(pData1 + line * j + 3 * i) = 0;
*(pData1 + line * j + 3 * i) = 0;
*(pData1 + line * j + 3 * i) = 255;
你对同一个字节付了3次值?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧