1、参考网址:

  http://blog.sina.com.cn/s/blog_678b377a0100mlyb.html

  http://blog.csdn.net/weiyongtao87/article/details/8290500

1.1、

#include <stdio.h>
#include <windows.h> #define DIB_HEADER_MARKER ( (WORD)('M' << 8) | 'B' )
DECLARE_HANDLE(HDIB); // DIB句柄 (ZC: 貌似就是定义一个句柄类型) void main()
{
char* pcFullFileName = "";
HANDLE hFile = CreateFile(pcFullFileName,
GENERIC_READ, //必须有GENERIC_READ属性才能得到时间
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,//TRUNCATE_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{ return; } // 第一步:判定文件是不是bmp文件。从文件里读取头文件,然后读取文件头的类型属性。
::SetFilePointer(hFile, , NULL, FILE_BEGIN);// 指针移动(文件偏移) BITMAPFILEHEADER bmfHeader = {};
DWORD dwRead = ;
// 尝试读取DIB文件头
if (! ReadFile(hFile, &bmfHeader, sizeof(bmfHeader), &dwRead, NULL))
{ return; }
if ( sizeof(bmfHeader) != dwRead )
{
// 大小不对
return;
}
// 判断是否是DIB对象,检查头两个字节是否是"BM"
if (bmfHeader.bfType != DIB_HEADER_MARKER)
{
// 非DIB对象
return;
} // 第二步:用文件的字节数减去文件头的字节数后,读取后面的数据即是bmp的像素。
// 获取DIB(文件)长度(字节)
DWORD dwBitsSize = GetFileSize(hFile, NULL);// 文件大小
// 为DIB分配内存
HDIB hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);// // ZC: 这里需要分配这么大的空间吗?(连BITMAPFILEHEADER占的空间也一起分配进去了)
if (hDIB == )
{
// 内存分配失败
return;
} // 锁定
void* pMem = ::GlobalLock( (HGLOBAL)hDIB );
// 读象素
::SetFilePointer(hFile, sizeof(bmfHeader), NULL, FILE_BEGIN);
dwRead = ;
if (! ReadFile(hFile, pMem, dwBitsSize - sizeof(BITMAPFILEHEADER), &dwRead, NULL))
{ return; } if (dwRead != dwBitsSize - sizeof(BITMAPFILEHEADER) )
{
// 大小不对。 // 解除锁定
::GlobalUnlock((HGLOBAL)hDIB); // 释放内存
::GlobalFree(pMem); return;
} // 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
} // 一、
// 对于24位bmp图片,每一个像素点存放着此点的RGB值。
// 首先定义一个结构体,包含红(red)、绿(green)、蓝(blue)这三个字段,如下:
//像素颜色值
typedef struct tagPOINTZ
{
BYTE b;
BYTE g;
BYTE r;
} POINTZ; void TestZ(BITMAPINFOHEADER _bih, FILE* _f)
{
int i=, j=;
// 二、
// 接下来定义用来存放每一像素点RGB值的变量,为了与bmp图像的行、列对应,定义存放数据的变量如下:
POINTZ **pix;
// 其中,pix[i][j]代表第i行j列处像素点的RGB值。
// 根据bmp图像宽与高,为指针变量动态分配内存空间,如下所示:
//为标准图像每一个像素申请内存
pix = (POINTZ **)malloc(sizeof(POINTZ*) * _bih.biHeight);
for(i=; i<_bih.biHeight; i++)
*(pix+i) = (POINTZ*)malloc(sizeof(POINT) * _bih.biWidth); // 其中,bi_in.biHeight为图像高度,bi_in.biWidth为图像宽度。
// 读取图像每一像素点处的RGB值至pix变量中,如下:
//读取图像数据
for(i=; i<_bih.biHeight; i++)
for(j=; j<_bih.biWidth; j++)
fread(*(pix+i)+j, sizeof(POINTZ), , _f);
// 现在,pix变量中就存放了整幅图像数据。可以通过下标或者指针运算读取任意点处的RGB值。 }

2、

3、

4、

5、

BMP操作_测试的更多相关文章

  1. JavaWeb_(Mybatis框架)使用Mybatis对表进行增、删、改、查操作_二

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  2. Javascript Jquery 中的数组定义与操作_子木玲_新浪博客

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  3. BZOJ_1858_[Scoi2010]序列操作_线段树

    BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...

  4. 分页技巧_测试并继续改进分页用的QueryHelper辅助对象

    分页技巧_测试并继续改进分页用的QueryHelper辅助对象 QueryHelper.java /** * 用于辅助拼接HQL语句 */ public class QueryHelper { pri ...

  5. cb19a_c++_只适合string类型的操作_提取_追加_替换

    *cb19a_c++_只适合string类型的操作_提取_追加_替换三个substr重载函数-获取一个字符串的一部分六个append重载函数-追加字符十个replace重载函数-替换更换 重载函数越多 ...

  6. 系统管理模块_用户管理1_实现用户有关的功能_测试功能、解决事务的问题、对密码进行MD5摘要

    系统管理模块__用户管理1__实现用户有关的功能 了解用户管理要做什么(增删改查初始化密码) 设计实体 分析功能有几个对应几个请求 增删改查有6个请求,初始化密码一个 实现增删改查一组功能的步骤流程 ...

  7. mysql常用操作(测试必备)

    现在互联网的主流关系型数据库是mysql,掌握其基本的增.删.改.查是每一个测试人员必备的技能. sql语言分类 1.DDL语句(数据库定义语言): 数据库.表.视图.索引.存储过程,例如:CREAT ...

  8. VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式

    [1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...

  9. MySQL 复制+快照恢复误删除操作实验测试

    下面假定2个场景: 场景1:主从架构,没有延迟,某DBA误操作:drop database [复制+快照:在线备份]场景2:存在不确定性或者风险性较大的操作,如升级测试,大表变更[啥事都在快照上折腾, ...

随机推荐

  1. Python网络编程,粘包、分包问题的解决

    tcp编程中的粘包.分包问题的解决: 参考:https://blog.csdn.net/yannanxiu/article/details/52096465 服务端: #!/bin/env pytho ...

  2. ora-24550 signo=6 signo=11解决

    我们有台测试服务器pro*c/oci应用总是发生各种比较奇葩的现象,就这一台机器会发生,其他几十台都不会发生. sig 11的原因,内存地址访问越界.各signo的si_code含义可参考http:/ ...

  3. mysql 5.7/percona server/mariadb 10.2安装与服务器参数优化

    建议使用percona server linux generic版,从https://www.percona.com/downloads/Percona-Server-LATEST/下载,现在不在推荐 ...

  4. 【题解】Luogu P2073 送花

    原题传送门 这题需要用到Splay 我们用一棵splay维护金钱 考虑c<=1000000 我们珂以把每种价格现在对应的美丽值存在一个a数组中 这样讲有珂能不太清楚qaq,还是对着操作一个一个讲 ...

  5. What is probabilistic programming? | 中文翻译

    What is probabilistic programming? | 中文翻译 Probabilistic languages can free developers from the compl ...

  6. opencv学习之路(3)、批量读取图片、视频分解、视频合成

    一.批量有序读取图片 #include<opencv2/opencv.hpp> using namespace cv; void main() { //批量读取图片(有序) ]; ]; M ...

  7. PyCharm笔记之首次安装和激活

    转载:http://www.cnblogs.com/Ivyli4258/p/7440147.html PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其 ...

  8. topcoder srm 555 div1

    problem1 link 直接动态规划即可. problem2 link 假设有$r$行,$c$列被修改了奇数次,那么一定有$r*W+c*H-2*r*c=S$.可以枚举这样的组合$(r,c)$,然后 ...

  9. 浅尝flutter中的http请求

    import 'package:flutter/material.dart'; class News extends StatefulWidget { final String title,imgli ...

  10. $on在构造器外部添加事件(通过$emit进行外部调用)$once执行一次的事件(通过$emit进行外部调用)$off关闭事件

    $on 在构造器外部添加事件. $on接收两个参数,第一个参数是调用时的事件名称,第二个参数是一个匿名方法. 如果按钮在作用域外部,可以利用$emit来执行. html <div id=&quo ...