#include <stdio.h>
#include <stdlib.h>
#include <string.h> int main(int argc, char *argv[])
{
int row, col;
int width, height, widthbyte, bitcount, imagesize, bytecount;
const char *magenta = NULL;
const char *magendiff = NULL;
unsigned char header[] =
{
0x42, 0x4D, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, // 2 AA->FileSize
0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0x28, 0x00, // 10 BB->OffBits
0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, // 18 CC->Width
0xDD, 0xDD, 0x01, 0x00, 0xEE, 0xEE, 0x00, 0x00, // 22 DD->Height
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, // 28 EE->BitCount
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 34 FF->ImageSize
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; FILE *fpA = NULL;
FILE *fpB = NULL;
FILE *fpC = NULL;
const char *filenameA = "A.bmp";
const char *filenameB = "B.bmp";
const char *filenameC = "C.bmp";
unsigned char *rowbufA = NULL;
unsigned char *rowbufB = NULL; const char * errmsg = NULL; switch(argc)
{
case :
break;
case :
break;
case :
filenameA = argv[];
filenameB = argv[];
break;
case :
filenameA = argv[];
filenameB = argv[];
filenameC = argv[];
break;
} do
{
fpA = fopen(filenameA, "rb");
if(fpA == NULL) { errmsg = "A.bmp open failed"; break; }; fpB = fopen(filenameB, "rb");
if(fpB == NULL) { errmsg = "B.bmp open failed"; break; }; // read file A.bmp
fread(header, sizeof(header), 1L, fpA);
width = *((int *)(header + ));
height = *((int *)(header + ));
bitcount = *((short *)(header + ));
imagesize = *((int *)(header + ));
widthbyte = (width * bitcount + ) / * ;
bytecount = bitcount / ;
switch(bitcount)
{
case :
magenta = "\x1F\x7C";
magendiff = "\x1F\x7C";
break;
case :
case :
magenta = "\x00\x00\x00\x00";
magendiff = "\x00\x00\xFF\xFF";
break;
default:
errmsg = "A.bitcount != 16 or 24 or 32";
break;
}
if(errmsg) break; // check file B.bmp
fread(header, sizeof(header), 1L, fpB);
if(width != *((int *)(header + ))) { errmsg = "A.width != B.width"; break; }
if(height != *((int *)(header + ))) { errmsg = "A.height != B.height"; break; }
if(bitcount != *((short *)(header + ))) { errmsg = "A.bitcount != B.bitcount"; break; }
if(imagesize != *((int *)(header + ))) { errmsg = "A.imagesize != B.imagesize"; break; } rowbufA = (unsigned char *)malloc(widthbyte);
if(rowbufA == NULL) { errmsg = "rowbufA malloc failed"; break; } rowbufB = (unsigned char *)malloc(widthbyte);
if(rowbufB == NULL) { errmsg = "rowbufB malloc failed"; break; } fpC = fopen(filenameC, "wb");
if(fpC == NULL) { errmsg = "C.bmp open failed"; break; }; // wirte file C.bmp
fwrite(header, sizeof(header), 1L, fpC);
for(row = ; row < height; row++)
{
fread(rowbufA, widthbyte, , fpA);
fread(rowbufB, widthbyte, , fpB); for(col = ; col < width; col++)
{
if(memcmp(rowbufA + bytecount * col, rowbufB + bytecount * col, bytecount) == )
{
memcpy(rowbufB + bytecount * col, magenta, bytecount);
}
else
{
memcpy(rowbufB + bytecount * col, magendiff, bytecount);
}
} fwrite(rowbufB, widthbyte, , fpC);
} } while(); if(fpA) fclose(fpA);
if(fpB) fclose(fpB);
if(fpC) fclose(fpC);
if(rowbufA) free(rowbufA);
if(rowbufB) free(rowbufB); if(errmsg)
{
printf("%s\n", errmsg);
system("PAUSE");
} return ;
}

BMP图像差分/比较的更多相关文章

  1. BMP图像数据格式详解

    一.简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式.Windows系统内部各图像绘制操作都是以B ...

  2. 远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像

    远程控制编写之屏幕传输  MFC实现  屏幕截图 发送bmp数据 显示bmp图像: 一 : 首先要了解bmp图像的结构 详情请看我转载的一篇文章http://blog.csdn.net/hnust_x ...

  3. 【转】BMP图像文件格式

    5.1  BMP图像文件格式 BMP图像文件格式是游戏中常用的图像资源文件格式,BMP图像文件起源早,程序员对BMP都比较熟悉,再加上BMP格式简单,读取和写入非常容易实现,所以无论Windows的还 ...

  4. MFC显示bmp图像

    有了bmp文件读写的基础,我们就能够開始用MFC显示BMP图片了. 在这里,事实上微软为我们提供了一个实现bmp文件显示的框架,名叫diblook,我们能够先下载下来看看. 以下上链接:DIBLOOK ...

  5. 读取BMP图像size的时候与操作和左移的原因

    在读取一个bmp图像的时候,我们会将它的大小读取出来,如果还不清楚bmp的文件结构,那就先看一下这篇博客. 看完我将假设你已经明白所表示的意义.那么,对于bfSize, 它的表示数字为 50 00 0 ...

  6. c语言实现BMP图像转换为灰度图

    当初是自己要装X,非要用c来写信息隐藏作业,装了X,就得付出实践.查了好久资料,到期末才把作业交了,这里总结一下. 这道题是将真彩图转换为灰度图. 关于BMP文件结构,这是困扰了我好久的问题,上网查了 ...

  7. 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)

    源代码:http://download.csdn.net/detail/nuptboyzhb/3961677 Ø  添加全屏截图菜单项,菜单项的属性如下; Ø  为该菜单项建立类向导. 编辑消息处理函 ...

  8. BMP图像直方图均衡算法(C语言大作业)

    万丈高楼平地起 C语言大作业 一.学习笔记篇 1.学习MarkDown MarkDown注重写作本身,而非花俏的界面 编辑器:vscode 插件:Markdown,Markdown Preview 2 ...

  9. bmp图像文件格式说明

    bmp图片文件包含4个部分数据,位图文件头,位图信息头,颜色表和位图数据(即RGB值). 在看位图格式之前先看一个问题,如果每个像素都用前面的24位色去表示,那么一个像素值需要3个字节数据,24位色也 ...

随机推荐

  1. [LeetCode] Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  2. [LeetCode] Letter Combinations of a Phone Number 电话号码的字母组合

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  3. NC6开发配置流程

    1.功能注册 2.菜单注册 3.单据类型管理 4.单据模板初始化 5.查询模板初始化 6.功能节点默认模板设置 7.编码对象注册.编码规则定义

  4. Djago模板拾起

    在view中使用template: 首先在settings.py中配置模板文件的路径. TEMPLATE_DIRS = ( '/home/django/mysite/templates', ) 1.变 ...

  5. 使用视 meta 标签来控制手机浏览器布局

    移动浏览器的Fennec一样呈现在一个虚拟的"窗口"页面(视),通常比屏幕宽.所以他们不需要去挤每个页面布局到一个小窗口(这会破坏许多非移动优化的网站) .用户可以平移和缩放才能看 ...

  6. 很不错的Intent用法 适用于正在开发的伙伴。自己看到了,也分享给大家吧。

    本文介绍Android中Intent的各种常见作用. 1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开 ...

  7. BZOJ1192 [HNOI2006]鬼谷子的钱袋

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. Beta版本冲刺第二天

    Aruba 408 409 410 428 429 431 完成任务: 分类界面,点击新建弹出输入名字的对话框,确定和取消按钮预留intent 添加通过分享保存到本应用的入口 立会照片: 燃尽图: c ...

  9. PHP 自动加载规范PSR-4

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  10. Day7-面向对象

    面向对象编程定义 OOP编程是利用"类"和"对象"来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并 ...