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位色也 ...
随机推荐
- [LeetCode] Line Reflection 直线对称
Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given ...
- 基于C/S架构的3D对战网络游戏C++框架_01服务器端与客户端需求分析
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 用EmEditor实现PDF转Word后的对齐排版
Redraw = false//禁止重绘(类似于VBA中的: Application.screenupdating=FALSE),以提高运行效率 //去除所有空行和只由空白字符构成的行 documen ...
- NPOI导出数据,设置格式,锁定单元格
代码包括: 1:导出多个sheet 2:设置单元格格式 3:合并单元格 4:下拉框选项 5:输入数字限制 6:锁定单元格 static void Main(string[] ar ...
- OC与JavaScript的交互
stringByEvaluatingJavaScriptFromString的用法,它的功能非常的强大,用起来非常简单,通过它我们可以很方便的操作uiwebview中的页面元素. UIWebView是 ...
- favicon.ico 404的问题(title栏前面的图标)
1.页面中自定义图标 去 http://www.bitbug.net/ 定制图片,有32*32,16*16等样式可供选择 2.在页面中引入定义的图片 <link rel="sho ...
- VirtualBox安装MS-DOS6.22(图文教程)
最近在读一些计算机发展史之类的文献,总感觉的纸上得来终觉浅,所以打算自己装一个MS-DOS,体验一下远古的操作系统!可以google到MS-DOS的安装文件: 为什么要分成三个呢?可以看到,每个大小都 ...
- wxpython绘制折线图
environment:win10 + eclipse + pydev + python2.7.11 + wxpython3.0.2 code sample: #!/usr/bin/env pytho ...
- java中获取路径的几种基本的方法
package com.ygh.blog.realpath; import java.io.File; import java.io.IOException; import java.io.Input ...
- 逆向工程学习第二天--动手开发自己的第一个shellcode
一个简单的c语言添加windows管理员账号的小程序,之前在渗透的时候经常用到,现在拿它来做自己的第一个shellcode. C代码: #pragma comment(lib, "netap ...