#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] Count Numbers with Unique Digits 计算各位不相同的数字个数

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

  2. [LeetCode] Compare Version Numbers 版本比较

    Compare two version numbers version1 and version1.If version1 > version2 return 1, if version1 &l ...

  3. [LeetCode] Balanced Binary Tree 平衡二叉树

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  4. [LeetCode] Rotate Image 旋转图像

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  5. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  6. Redis系列之(二):Redis主从同步,读写分离

    1. Redis主从同步 Redis支持主从同步.数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制. 2. 配置主从同步 Mater Slave的模式,从Slave向Maste ...

  7. php 设计模式--准备篇

    要了解设计模式 首先我们要先了解 php的命名空间和类的自动载入的功能 下面我们来说一下 命名空间 概念缘由:比如一个a.php的文章 但是我们需要两个 此时同一个目录下不可能存在两个a.php 那么 ...

  8. 【转】iOS,搜索标签布局

    前一阵时间,看过这样一个demo,代码不多,但是简洁易懂. 转自: //  代码地址: https://github.com/iphone5solo/PYSearch //  代码地址: http:/ ...

  9. Markdown

    1. 斜体和粗体 代码: *斜体*或_斜体_ **粗体** ***加粗斜体*** ~~删除线~~ 显示效果: 这是一段斜体 这是一段粗体 这是一段加粗斜体 这是一段删除线 2. 分级标题 第一种写法: ...

  10. layer.open打开iframe页面的调用父页面方法及关闭

    //调用父类方法 window.parent.exportData($('#shownum').val(),$('#splitstr').val()); //关闭iframe页面var index = ...