8位bmp文件获取像素
我这里使用的是底层C语言,求取8位bmp文件中每个像素点的像素值。
- 8位bmp文件结构剖析:
1280 * 1024的8位bmp文件由位图文件头、位图信息头、调色表、颜色数据四部分组成。
位图文件头占14个字节,主要包括文件类型与大小等。
位图信息头占40个字节,主要包括位图宽、高和颜色位数等。
调色表占1024个字节,8位图的调色表主要包含2^8 = 256种颜色,每种颜色由BGRA(蓝、绿、红、保留位)四个元素组成,即256 * 4 =1024个字节。
颜色数据(DIB)扫描是从下到上,从左到右的,也就是一幅图先绘制底部的像素,在绘制顶部的像素,在8位bmp图里,每个像素点只有一个表示灰阶的值(0-255),所以无需配置每个像素点的RGB颜色,每个像素点由一个字节表示像素值。
- 操作流程:
- 模拟一个14字节的位图文件头结构体,40字节的位图信息头结构体,4字节调色表结构体。
- 以追加读的方式打开bmp文件,堆上申请一块14字节的地址,指针类型为位图文件头结构体类型,读取14字节1次到该地址。
- 堆上申请一块40字节的地址,指针类型为位图信息头结构体类型,读取40字节1次到该地址。
- 堆上申请一块1024字节的地址,指针类型为调色表结构体类型,读取1024字节1次到该地址。
- 堆上申请一个宽1280、高1024的二维数组,每个元素大小为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文件获取像素相关推荐
- c语言读取24位BMP文件并实现翻转90度、180度、270度
BMP图片格式 BMP图片,是Bitmap(位图)的简称,它是windows显示图片的基本格式.在windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来.各种格式的图片文件也都 ...
- opengl读取24位BMP文件为纹理并处理黑色背景为透明
原理: 直接用BITMAP数据而未用到AUX库和windows LoadImage API 24位BItMap文件格式不细说,见度娘 格式要求:24位无压缩位图,必须是2^n*2^n大小 代码(C/ ...
- 纯C++实现24位bmp格式图片的读取和修饰
问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化.水平翻转.模糊.茶色滤镜四种效果的一种,并输出新图片,如下所示: 命令行输入: 其中: 参数1:-b/g/s/r,先后表示blur(模糊), ...
- c++ 24位bmp格式分析
问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化.水平翻转.模糊.茶色滤镜四种效果的一种,并输出新图片,如下所示: 命令行输入: 其中: 参数1:-b/g/s/r,先后表示blur(模糊), ...
- VC屏幕截图并保存为bmp文件
保存抓图的简单实现 实现类似的抓屏功能(简单的截图功能 ) 其实只要两个函数就行了,以下从网上摘抄的一段代码的改写, 算是原创吧 (http://www.wenyiwen.cn/a24/how1614 ...
- 截取屏幕指定区域保存为BMP文件
HBITMAP CopyScreenToBitmap(LPRECT lpRect) { //屏幕和内存设备描述表 HDC hSrcDC, hMemDC; //位图句柄 HBITMAP hBitmap, ...
- VC屏幕截图,保存为Bmp文件
新建一个MFC基于对话框的应用程序,在界面上放一个Button,为其实现点击事件,代码如下: void CScreenShotDlg::OnBtnScreenshot() {RECT rect = { ...
- 截取屏幕并保存为BMP文件
CDC *pDC;//屏幕DCpDC = CDC::FromHandle( ::GetDC(NULL) );//获取当前整个屏幕DCint BitPerPixel = pDC->GetDevic ...
- Java_最不重要位替换(LSB)基于24位BMP图片
隐写术的一个简单示例 向BMP图片中隐藏一段文字并保存,从保存的图片中提取文字. 原理:把需要隐藏的文本信息转换成二进制字符流,再将其拆分成一个个的0和1,隐藏在像素数据(RGB字节)中,因对RGB的 ...
- 图解Winhex解析BMP文件数据实例
一 实例解析 示例图片的属性: 原图: 红线处是文件头结束: 第二个红线处是位图信息头结束: 用windows画图取第(2,2)像素点的颜色:画图是从0开始计数,即第3行3列的像素: 搜索16进制的B ...
最新文章
- R语言可视化包ggplot2绘制饼图(pie chart)实战
- idea mybatis插件_IntelliJ IDEA插件推荐(二)
- visualvm远程监控jvm_大型企业JVM实战:优化及面试热点分析
- hdu max sum
- 我是如何把一个15分钟的程序优化到了10秒的
- TS流解析 二 *****
- 什么软件可以测试QQ特别关心,qq特别关心查询工具
- 找不到或无法加载主类什么意思(找不到或无法加载主类)
- java输出英文字母_用JAVA编一个程序输出全部的英文字母
- 米兔机器人恐龙拼图手册_米兔积木机器人(多形态组合、自平衡系统、App联动)...
- mac php pear pecl,MacOSX安装pecl - 米扑博客
- 对接熊迈SDK工作记录之实时视频和云录像功能集成
- 事物(Transaction)
- OpenJ_Bailian - 2692 假币问题
- 万豪又双叒叕翻车,520 万人隐私遭曝光
- 最新微信ipad协议 CODE获取 公众号授权等
- 什么是 Linux ?什么是操作系统
- :要求查询出每一个雇员的编号,姓名,工资,领导的姓名,部门名称及位置,工资所在公司的工资等级
- SSAO By Computer Shader(三)
- 计算机科学与应用专业介绍,专业介绍 | 计算机科学与技术