我这里使用的是底层C语言,求取8位bmp文件中每个像素点的像素值。

  1. 8位bmp文件结构剖析:
  • 1280 * 1024的8位bmp文件由位图文件头、位图信息头、调色表、颜色数据四部分组成。

  • 位图文件头占14个字节,主要包括文件类型与大小等。

  • 位图信息头占40个字节,主要包括位图宽、高和颜色位数等。

  • 调色表占1024个字节,8位图的调色表主要包含2^8 = 256种颜色,每种颜色由BGRA(蓝、绿、红、保留位)四个元素组成,即256 * 4 =1024个字节。

  • 颜色数据(DIB)扫描是从下到上,从左到右的,也就是一幅图先绘制底部的像素,在绘制顶部的像素,在8位bmp图里,每个像素点只有一个表示灰阶的值(0-255),所以无需配置每个像素点的RGB颜色,每个像素点由一个字节表示像素值。

  1. 操作流程:
  • 模拟一个14字节的位图文件头结构体,40字节的位图信息头结构体,4字节调色表结构体。
  • 以追加读的方式打开bmp文件,堆上申请一块14字节的地址,指针类型为位图文件头结构体类型,读取14字节1次到该地址
  • 堆上申请一块40字节的地址,指针类型为位图信息头结构体类型,读取40字节1次到该地址。
  • 堆上申请一块1024字节的地址,指针类型为调色表结构体类型,读取1024字节1次到该地址
  • 堆上申请一个宽1280、高1024的二维数组,每个元素大小为1字节,二维数组从左下角往右上角开始读取数据,每次读取1个字节1次,循环读取,将数据保存在二维数组中。
  • 关闭文件,释放手动释放堆上申请的资源。
  1. 代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>typedef unsigned int DWORD;  // 4bytes
typedef unsigned short WORD;  // 2bytes
typedef signed long LONG;  // 4bytes
typedef unsigned char BYTE;  // 1bytes#pragma pack(push)
#pragma pack(1)// 修改默认对齐值
/*位图文件文件头结构体*/
typedef struct tagBITMAPFILEHEADER {WORD bFileType;    //bmp图固定为0x4d42DWORD bFileSize;  //整个bmp文件大小,包括两个头、一个颜色表和颜色数据的总大小WORD bReserved1;  //保留字,不考虑,设为0即可WORD bReserved2;  //保留字,同上DWORD bPixelDataOffset;  //实际位图数据的偏移字节数,即前三个部分长度之和
}BITMAPFILEHEADER; //14bytes
#pragma pack(pop)/*位图文件信息头结构体*/
typedef struct tagBITMAPINFOHEADER {DWORD bHeaderSize;  // 图像信息头总大小(40bytes)LONG bImageWidth;  // 图像宽度(像素)LONG bImageHeight;  // 图像高度WORD bPlanes;  // 应该是0WORD bBitsPerPixel;   //采用颜色位数,可以是1,2,4,8,16,24,32,这里是8DWORD bCompression;  // 图像压缩方法DWORD bImageSize;  // 图像大小(字节)LONG bXpixelsPerMeter;  // 横向每米像素数  X方向分辨率  1 in = 0.0254 mLONG bYpixelsPerMeter;  // 纵向每米像素数DWORD bTotalColors;  // 使用的颜色总数,如果像素位数大于8,则该字段没有意义DWORD bImportantColors;  // 重要颜色数,
}BITMAPINFOHEADER; //40bytes/*位图文件调色板结构体*/
typedef struct tagRGBQUAD {BYTE rgbBlue;BYTE    rgbGreen;BYTE   rgbRed;BYTE rgbReserved;
}RGBQUAD;/*像素点RGB结构体*/
typedef struct tagRGB {BYTE blue;BYTE green;BYTE red;
}RGBDATA;int main() {//打开bmp文件,追加读FILE* fp = fopen("1280_1024.bmp", "rb");//读取头结构14字节BITMAPFILEHEADER* fileHead = (BITMAPFILEHEADER*)malloc(sizeof(BITMAPFILEHEADER));fread(fileHead, sizeof(BITMAPFILEHEADER), 1, fp);//读取头信息40字节BITMAPINFOHEADER* infoHead = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER));fread(infoHead, sizeof(BITMAPINFOHEADER), 1, fp);//打印头信息printf("信息头大小:%d字节\n", infoHead->bHeaderSize);printf("图片宽度:%d像素\n", infoHead->bImageWidth);printf("图片高度:%d像素\n", infoHead->bImageHeight);printf("颜色位数:%d位\n", infoHead->bBitsPerPixel);//开辟空间读取调色板1024字节RGBQUAD* rgbQuad = (RGBQUAD*)malloc(sizeof(RGBQUAD) * 256);fread(rgbQuad, 1024, 1, fp);//获取图像宽和高int width = infoHead->bImageWidth;int height = infoHead->bImageHeight;//堆上开辟二维数组空间BYTE** data = (BYTE**)malloc(sizeof(BYTE*) * height);for (int i = 0; i < height; i++){data[i] = (BYTE*)malloc(sizeof(BYTE) * width);}//读取像素信息存入二维数组for (int i = height - 1; i >= 0; i--){for (int j = 0; j < width; j++){fread(&data[i][j], sizeof(BYTE), 1, fp);}}//选取几个点测试一下是否正确,注意x和y的先后顺序printf("%d\n", data[10][5]);//释放资源free(rgbQuad);rgbQuad = NULL;for (int i = 0; i < height; i++){free(data[i]);}free(data);data = NULL;fclose(fp);free(fp);free(fileHead);free(infoHead);fileHead = NULL;infoHead = NULL;system("1280_1024.bmp");getchar();return 0;
}

8位bmp文件获取像素相关推荐

  1. c语言读取24位BMP文件并实现翻转90度、180度、270度

    BMP图片格式 BMP图片,是Bitmap(位图)的简称,它是windows显示图片的基本格式.在windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来.各种格式的图片文件也都 ...

  2. opengl读取24位BMP文件为纹理并处理黑色背景为透明

    原理: 直接用BITMAP数据而未用到AUX库和windows  LoadImage API 24位BItMap文件格式不细说,见度娘 格式要求:24位无压缩位图,必须是2^n*2^n大小 代码(C/ ...

  3. 纯C++实现24位bmp格式图片的读取和修饰

    问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化.水平翻转.模糊.茶色滤镜四种效果的一种,并输出新图片,如下所示: 命令行输入: 其中: 参数1:-b/g/s/r,先后表示blur(模糊), ...

  4. c++ 24位bmp格式分析

    问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化.水平翻转.模糊.茶色滤镜四种效果的一种,并输出新图片,如下所示: 命令行输入: 其中: 参数1:-b/g/s/r,先后表示blur(模糊), ...

  5. VC屏幕截图并保存为bmp文件

    保存抓图的简单实现 实现类似的抓屏功能(简单的截图功能 ) 其实只要两个函数就行了,以下从网上摘抄的一段代码的改写, 算是原创吧 (http://www.wenyiwen.cn/a24/how1614 ...

  6. 截取屏幕指定区域保存为BMP文件

    HBITMAP CopyScreenToBitmap(LPRECT lpRect) { //屏幕和内存设备描述表 HDC hSrcDC, hMemDC; //位图句柄 HBITMAP hBitmap, ...

  7. VC屏幕截图,保存为Bmp文件

    新建一个MFC基于对话框的应用程序,在界面上放一个Button,为其实现点击事件,代码如下: void CScreenShotDlg::OnBtnScreenshot() {RECT rect = { ...

  8. 截取屏幕并保存为BMP文件

    CDC *pDC;//屏幕DCpDC = CDC::FromHandle( ::GetDC(NULL) );//获取当前整个屏幕DCint BitPerPixel = pDC->GetDevic ...

  9. Java_最不重要位替换(LSB)基于24位BMP图片

    隐写术的一个简单示例 向BMP图片中隐藏一段文字并保存,从保存的图片中提取文字. 原理:把需要隐藏的文本信息转换成二进制字符流,再将其拆分成一个个的0和1,隐藏在像素数据(RGB字节)中,因对RGB的 ...

  10. 图解Winhex解析BMP文件数据实例

    一 实例解析 示例图片的属性: 原图: 红线处是文件头结束: 第二个红线处是位图信息头结束: 用windows画图取第(2,2)像素点的颜色:画图是从0开始计数,即第3行3列的像素: 搜索16进制的B ...

最新文章

  1. R语言可视化包ggplot2绘制饼图(pie chart)实战
  2. idea mybatis插件_IntelliJ IDEA插件推荐(二)
  3. visualvm远程监控jvm_大型企业JVM实战:优化及面试热点分析
  4. hdu max sum
  5. 我是如何把一个15分钟的程序优化到了10秒的
  6. TS流解析 二 *****
  7. 什么软件可以测试QQ特别关心,qq特别关心查询工具
  8. 找不到或无法加载主类什么意思(找不到或无法加载主类)
  9. java输出英文字母_用JAVA编一个程序输出全部的英文字母
  10. 米兔机器人恐龙拼图手册_米兔积木机器人(多形态组合、自平衡系统、App联动)...
  11. mac php pear pecl,MacOSX安装pecl - 米扑博客
  12. 对接熊迈SDK工作记录之实时视频和云录像功能集成
  13. 事物(Transaction)
  14. OpenJ_Bailian - 2692 假币问题
  15. 万豪又双叒叕翻车,520 万人隐私遭曝光
  16. 最新微信ipad协议 CODE获取 公众号授权等
  17. 什么是 Linux ?什么是操作系统
  18. :要求查询出每一个雇员的编号,姓名,工资,领导的姓名,部门名称及位置,工资所在公司的工资等级
  19. SSAO By Computer Shader(三)
  20. 计算机科学与应用专业介绍,专业介绍 | 计算机科学与技术

热门文章

  1. typecho添加html5视频播放器,Typecho音乐播放器插件AudioPlayer1.2.6更新
  2. matplotlib实现区域颜色填充
  3. 风入松——北大校园的风入松书店不知何处去
  4. HTTP技术快速提升网页的访问速度
  5. 面试过阿里等互联网大公司,我知道了这些套路
  6. 用创新思考模式制作人工智能机器人模型
  7. Mac关闭fn切换输入法功能
  8. 送男孩子情人节礼物送什么?情人节必备礼物合集
  9. 架构师实践日 8.18 北京站 | 智慧教育的智慧化探索,引领高效学习新出路
  10. Sigma-Delta 调制