zoukankan      html  css  js  c++  java
  • 位图文件的保存

    上一篇文章中,介绍了位图的文件格式以及如何将其读入到内存中。本文主要介绍如何将处理后的位图数据从内存保存到磁盘。
    位图文件主要有4部分组成:

    1. 文件头信息
    2. 位图头信息
    3. 调色板 ,在1、8、16位色中存在调试板;在24和32位色中无调色板,直接使用像素各通道的值混合成像素颜色。
    4. 位图的数据
      将位图写入磁盘文件也就是依次将文件头信息位图头信息位图数据,写到磁盘。由于在24和32位真色彩下,
      不需要调色板,这里不对调色板进行处理。

    1. 填充文件头

    在Window中结构体BITMAPFILEHEADER代表着文件头信息,在文件头信息中有以下三个字段比较重要:

    1. byType,文件类型,必须为0x4D42(BM),表示是位图文件。
    2. bfSize,文件的大小,也就是文件头信息、位图头信息和位图数据在一起的大小。
    3. 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,其重要的字段如下:

    1. biBitCount 每个像素所占用的位数
    2. biCompression 压缩方法,对于位图文件一般设置为0,不压缩。
    3. width、height 位图的宽和高
    4. 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的实现,有机会要自己定义各部分的结构体,实现位图文件的读写。

  • 相关阅读:
    linux 进入 GNOME X 界面
    POJ 3436 ACM Computer Factory (拆点+最大流)
    学习:EF(Entity Framwork)结构【转】
    .net上传Excel,解析Excel,导出CSV
    在Handler里面使用Session
    如何用JavaScript判断访问的来源是电脑还是手机,是什么浏览器?
    ASP.NET List泛型分页代码 【转】
    ASP.NET MVC中实现多个按钮提交的几种方法【转】
    清空数据库所有表,所有存储过程SQL语句
    可以不被浏览器拦截的弹出窗口
  • 原文地址:https://www.cnblogs.com/wangguchangqing/p/5432227.html
Copyright © 2011-2022 走看看