BMP图像差分/比较
#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图像差分/比较的更多相关文章
- BMP图像数据格式详解
一.简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式.Windows系统内部各图像绘制操作都是以B ...
- 远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像
远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像: 一 : 首先要了解bmp图像的结构 详情请看我转载的一篇文章http://blog.csdn.net/hnust_x ...
- 【转】BMP图像文件格式
5.1 BMP图像文件格式 BMP图像文件格式是游戏中常用的图像资源文件格式,BMP图像文件起源早,程序员对BMP都比较熟悉,再加上BMP格式简单,读取和写入非常容易实现,所以无论Windows的还 ...
- MFC显示bmp图像
有了bmp文件读写的基础,我们就能够開始用MFC显示BMP图片了. 在这里,事实上微软为我们提供了一个实现bmp文件显示的框架,名叫diblook,我们能够先下载下来看看. 以下上链接:DIBLOOK ...
- 读取BMP图像size的时候与操作和左移的原因
在读取一个bmp图像的时候,我们会将它的大小读取出来,如果还不清楚bmp的文件结构,那就先看一下这篇博客. 看完我将假设你已经明白所表示的意义.那么,对于bfSize, 它的表示数字为 50 00 0 ...
- c语言实现BMP图像转换为灰度图
当初是自己要装X,非要用c来写信息隐藏作业,装了X,就得付出实践.查了好久资料,到期末才把作业交了,这里总结一下. 这道题是将真彩图转换为灰度图. 关于BMP文件结构,这是困扰了我好久的问题,上网查了 ...
- 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)
源代码:http://download.csdn.net/detail/nuptboyzhb/3961677 Ø 添加全屏截图菜单项,菜单项的属性如下; Ø 为该菜单项建立类向导. 编辑消息处理函 ...
- BMP图像直方图均衡算法(C语言大作业)
万丈高楼平地起 C语言大作业 一.学习笔记篇 1.学习MarkDown MarkDown注重写作本身,而非花俏的界面 编辑器:vscode 插件:Markdown,Markdown Preview 2 ...
- bmp图像文件格式说明
bmp图片文件包含4个部分数据,位图文件头,位图信息头,颜色表和位图数据(即RGB值). 在看位图格式之前先看一个问题,如果每个像素都用前面的24位色去表示,那么一个像素值需要3个字节数据,24位色也 ...
随机推荐
- 微信小程序-多级联动
微信小程序中的多级联动 这里用到的案例是城市选择器 先上代码: .wxml <view class="{{boxHide}}"> <view>{{nian} ...
- [LeetCode] Find Leaves of Binary Tree 找二叉树的叶节点
Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...
- [LeetCode] Serialize and Deserialize Binary Tree 二叉树的序列化和去序列化
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- [网站公告]数据库服务器IOPS跑满造成网站不能正常访问
今年下午13:20-14:20左右,突增的访问量引发数据库服务器(阿里云RDS)IOPS跑满,造成大量请求执行缓慢,从而严重影响了网站的正常访问,给大家带来很大的麻烦,望大家谅解! 在出现故障时,当我 ...
- VehicleCamera解读
坐标系: z-axis ^ | | y-axis | / | / |/ +----------------> x-axis 围绕Z轴旋转叫做偏航角,Yaw:围绕X轴旋转叫做 俯仰角,Pitch: ...
- ASP.NET-DataList控件-DataList嵌套
DataList是ASP.NET的数据控件之一,在使用时要对其进行数据绑定.但是使用过程中难免会出现需要根据已绑定表中的某列数据来作进一步的查询和显示,就需要使用DataList嵌套来解决此类问题. ...
- [转]SQL 常用函数及示例
原文地址:http://www.cnblogs.com/canyangfeixue/archive/2013/07/21/3203588.html --SQL 基础-->常用函数 --===== ...
- 滚来滚去,滚来滚去...Scroller完全解析
API: 1 mScroller.getCurrX() //获取mScroller当前水平滚动的位置 2 mScroller.getCurrY() //获取mScroller当前竖直滚动的位置 3 m ...
- SQL语句-创建索引
语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名)WITH FILLFACTOR = 填充因子值0~100 GO USE 库名GO IF EXISTS (SELECT * FRO ...
- Oracle 查询表中字段里数据是否有重复
1.查找单个字段 select 字段名,count(*) from table group by 字段名 having count(*) > 1 2.查找组合字段: SELECT TEST_NA ...