位图文件的保存
2016-04-25 18:25
316 查看
在上一篇文章中,介绍了位图的文件格式以及如何将其读入到内存中。本文主要介绍如何将处理后的位图数据从内存保存到磁盘。
位图文件主要有4部分组成:
文件头信息
位图头信息
调色板 ,在1、8、16位色中存在调试板;在24和32位色中无调色板,直接使用像素各通道的值混合成像素颜色。
位图的数据
将位图写入磁盘文件也就是依次将文件头信息、位图头信息和位图数据,写到磁盘。由于在24和32位真色彩下,
不需要调色板,这里不对调色板进行处理。
byType,文件类型,必须为0x4D42(BM),表示是位图文件。
bfSize,文件的大小,也就是文件头信息、位图头信息和位图数据在一起的大小。
bfOffBits,偏移量,位图数据相对于文件头的便宜量。
文件头信息的填充如下:
其中,depth是像素深度也就是每个像素所占用的字节数(24位是3,32位为4)。bfReserved1和bfReserved2是保留字段,填充为0.
biBitCount 每个像素所占用的位数
biCompression 压缩方法,对于位图文件一般设置为0,不压缩。
width、height 位图的宽和高
biSizeImage 位图数据的大小 width * height * biBitCount / 8
具体的填充如下:
了解位图的存储格式后,将位图保存到磁盘还是挺简单的,这里是基于Windows SDK的实现,有机会要自己定义各部分的结构体,实现位图文件的读写。
位图文件主要有4部分组成:
文件头信息
位图头信息
调色板 ,在1、8、16位色中存在调试板;在24和32位色中无调色板,直接使用像素各通道的值混合成像素颜色。
位图的数据
将位图写入磁盘文件也就是依次将文件头信息、位图头信息和位图数据,写到磁盘。由于在24和32位真色彩下,
不需要调色板,这里不对调色板进行处理。
1. 填充文件头
在Window中结构体BITMAPFILEHEADER代表着文件头信息,在文件头信息中有以下三个字段比较重要:
byType,文件类型,必须为0x4D42(BM),表示是位图文件。
bfSize,文件的大小,也就是文件头信息、位图头信息和位图数据在一起的大小。
bfOffBits,偏移量,位图数据相对于文件头的便宜量。
文件头信息的填充如下:
BITMAPFILEHEADER fileHeader; fileHeader.bfType = 0x4d42; // BM fileHeader.bfReserved1 = 0; fileHeader.bfReserved2 = 0 ; fileHeader.bfSize = width * height * depth + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) ;
其中,depth是像素深度也就是每个像素所占用的字节数(24位是3,32位为4)。bfReserved1和bfReserved2是保留字段,填充为0.
2. 填充位图头信息
位图头信息包含了位图的长宽、颜色格式等信息,其对应的结构体为BITMAPINFOHEADER,其重要的字段如下:
biBitCount 每个像素所占用的位数
biCompression 压缩方法,对于位图文件一般设置为0,不压缩。
width、height 位图的宽和高
biSizeImage 位图数据的大小 width * height * biBitCount / 8
具体的填充如下:
BITMAPINFOHEADER infoHeader; infoHeader.biBitCount = depth * 8; infoHeader.biClrImportant = 0; infoHeader.biClrUsed = 0; infoHeader.biCompression = 0 ; infoHeader.biHeight = height; infoHeader.biWidth = width; infoHeader.biPlanes = 1; infoHeader.biSize = sizeof(BITMAPINFOHEADER); infoHeader.biSizeImage = width * height * depth; infoHeader.biXPelsPerMeter = 3779; infoHeader.biYPelsPerMeter = 3779;
3. 写文件到磁盘
填充后各部分信息后,依次写入到磁盘即可。if(file.Open(filePath,CFile::modeCreate | CFile::modeWrite)) { file.Write(&fileHeader,sizeof(BITMAPFILEHEADER)); file.Write(&infoHeader,sizeof(BITMAPINFOHEADER)); file.Write(imageBuffer,width * height * depth); file.Close(); return true; }
了解位图的存储格式后,将位图保存到磁盘还是挺简单的,这里是基于Windows SDK的实现,有机会要自己定义各部分的结构体,实现位图文件的读写。
相关文章推荐
- 游云SDK for Cordova API
- 安卓 为view每条边指定不同的边框
- 思科模拟器上完成单臂路由配置的试验纪实
- Apache的下载
- 大数运算之字符串模拟
- tomcat 404 配置的问题
- doGet和doPost乱码
- UEFI的两种启动模式
- 基于@Aspectj使用Spring aop @Around进行权限拦截
- Fast-Start Failover工作过程及实例
- IMAX B6电路原理详解
- Js 时间间隔计算(间隔天数)
- 使用FindFirstFile,FindNextFile遍历一个文件夹
- OpenGL vs2010 ActiveX Control Test Container
- modsecurity系列四:规则实战2
- Unity3D 学习日记(八) DoTween学习笔记之Tweener(二)
- ANDROID内存优化(大汇总——上)
- DG BROKER 之 REINSTATE DATABASE (把旧主库恢复到备用库)
- YII安装步骤(windows)
- 二叉树