#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. 微信支付(.NET版)

    前段时间做了网页版微信支付,遇到很多问题,不过最终还是解决了,现在在这里记录下开发流程以及说明,给其他人一些参考. 一.准备工作     首先肯定得先要开通微信支付功能,之前开通微信支付需要三万的押金 ...

  2. FCM聚类算法介绍

    FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小.模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则 ...

  3. JVM_七种垃圾收集器介绍

    本文中的垃圾收集器研究背景为:HotSpot+JDK7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老代的算法. JVM会从年轻代和年 ...

  4. MySQL/MariaDB/PerconaDB-提权条件竞争漏洞

    背景 2016年11月01日,国外安全研究员Dawid Golunski在 MySQl, MariaDB 和 PerconaDB 数据库中发现条件竞争漏洞,该漏洞允许本地用户使用低权限(CREATE/ ...

  5. 在windows上部署使用Redis

    参考地址: http://keenwon.com/1275.html

  6. 渗透测试-信息收集-c段收集

    平时做渗透测试我比较喜欢用lijiejie 写的 subDomainsBrute来爆破子域名 那么爆破完成后就想收集一下网站的c段信息 下面以平安为例 爆破得到子域名为 i.pingan.com.cn ...

  7. Beta阶段发布说明

    OverWatch来浪狼人杀助手Beta版本发布说明 Beta版本的新功能 添加了忘记密码与重置密码的功能 添加了语音流程提示的功能 添加了搜索好友的功能 添加了添加好友的功能 添加了能够直接通过点击 ...

  8. bzoj 4326: NOIP2015 运输计划

    4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个 ...

  9. 19个必须知道的Visual Studio快捷键

    项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示Solution Explorer(解决方案资源管理器) Shift + Alt+ C = 添加 ...

  10. UP board 漫谈(1)——从Atom到UP Board

    title: UP board 漫谈(1)--从Atom到UP Board date: 2016-12-26 12:33:03 tags: UP board categories: 开发板 perma ...