- 浏览: 13784 次
- 性别:
- 来自: 北京
最新评论
bmp图片格式
- 博客分类:
- 技术杂绘
bmp图片格式
2010年11月18日
BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的 空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
文件结构:
典型的BMP图像文件由四部分组成:
1:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
位图的类型:
位图一共有两种类型,即:设备相关位图(DDB)和设备无关位图(DIB)。DDB位图在早期的Windows系统(Windows 3.0以前)中是很普遍的,事实上它也是唯一的。然而,随着显示器制造技术的进步,以及显示设备的多样化,DDB位图的一些固有的问题开始浮现出来了。比如,它不能够存储(或者说获取)创建这张图片的原始设备的分辨率,这样,应用程序就不能快速的判断客户机的显示设备是否适合显示这张图片。为了解决这一难 题,微软创建了DIB位图格式。
设备无关位图 (Device-Independent Bitmap)
DIB位图包含下列的颜色和尺寸信息:
* 原始设备(即创建图片的设备)的颜色格式。
* 原始设备的分辨率。
* 原始设备的调色板
* 一个位数组,由红、绿、蓝(RGB)三个值代表一个像素。
* 一个数组压缩标志,用于表明数据的压缩方案(如果需要的话)。
以上这些信息保存在BITMAPINFO结构中,该结构由BITMAPINFOHEADER结构和两个或更多个RGBQUAD结构所组成。 BITMAPINFOHEADER结构所包含的成员表明了图像的尺寸、原始设备的颜色格式、以及数据压缩方案等信息。RGBQUAD结构标识了像素所用到的颜色数据。
DIB位图也有两种形式,即:底到上型DIB(bottom-up),和顶到下型DIB(top-down)。底到上型DIB的原点(origin) 在图像的左下角,而顶到下型DIB的原点在图像的左上角。如果DIB的高度值(由BITMAPINFOHEADER结构中的biHeight成员标识)是 一个正值,那么就表明这个DIB是一个底到上型DIB,如果高度值是一个负值,那么它就是一个顶到下型DIB。注意:顶到下型的DIB位图是不能被压缩的。
位图的颜色格式是通过颜色面板值(planes)和颜色位值(bitcount)计算得来的,颜色面板值永远是1,而颜色位值则可以是1、4、8、 16、24、32其中的一个。如果它是1,则表示位图是一张单色位图(译者注:通常是黑白位图,只有黑和白两种颜色,当然它也可以是任意两种指定的颜色),如果它是4,则表示这是一张VGA位图,如果它是8、16、24、或是32,则表示该位图是其他设备所产生的位图。如果应用程序想获取当前显示设备(或打印机)的颜色位值(或称位深度),可调用API函数GetDeviceCaps(),并将第二个参数设为BITSPIXEL即可。
显示设备的分辨率是以每米多少个像素来表明的,应用程序可以通过以下三个步骤来获取显示设备或打印机的水平分辨率:
1. 调用GetDeviceCaps()函数,指定第二个参数为HORZRES。
2. 再次调用GetDeviceCaps()函数,指定第二个参数为HORZSIZE。
3. 用第一个返回值除以第二个返回值。即:DetDeviceCaps(hDC,HORZRES)/GetDeviceCaps(hDC,HORZSIZE);
应用程序也可以使用相同的三个步骤来获取设备的垂直分辨率,不同之处只是要将HORZRES替换为VERTRES,把HORZSIZE替换为VERTSIZE,即可。
调色板是被保存在一个RGBQUAD结构的数组中,该结构指出了每一种颜色的红、绿、蓝的分量值。位数组中的每一个索引都对应于一个调色板项(即一个RGBQUAD结构),应用程序将根据这种对应关系,将像素索引值转换为像素RGB值(真实的像素颜色)。应用程序也可以通过调用 GetDeviceCaps()函数来获取当前显示设备的调色板尺寸(将该函数的第二个参数设为NUMCOLORS即可)。
Win32 API支持位数据的压缩(只对8位和4位的底到上型DIB位图)。压缩方法是采用运行长度编码方案(RLE),RLE使用两个字节来描述一个句法,第一个 字节表示重复像素的个数,第二个字节表示重复像素的索引值。有关压缩位图的详细信息请参见对BITMAPINFOHEADER结构的解释。
应用程序可以从一个DDB位图创建出一个DIB位图,步骤是,先初始化一些必要的结构,然后再调用GetDIBits()函数。不过,有些显示设备有 可能不支持这个函数,你可以通过调用GetDeviceCaps()函数来确定一下(GetDeviceCaps()函数在调用时指定 RC_DI_BITMAP作为RASTERCAPS的标志)。
应用程序可以用DIB去设置显示设备上的像素(译者注:也就是显示DIB),方法是调用SetDIBitsToDevice()函数或调用 StretchDIBits()函数。同样,有些显示设备也有可能不支持以上这两个函数,这时你可以指定RC_DIBTODEV作为RASTERCAPS 标志,然后调用GetDeviceCaps()函数来判断该设备是否支持SetDIBitsToDevice()函数。也可以指定 RC_STRETCHDIB作为RASTERCAPS标志来调用GetDeviceCaps()函数,来判断该设备是否支持 StretchDIBits()函数。
如果应用程序只是要简单的显示一个已经存在的DIB位图,那么它只要调用SetDIBitsToDevice()函数就可以。比如一个电子表格软件, 它可以打开一个图表文件,在窗口中简单的调用SetDIBitsToDevice()函数,将图形显示在窗口中。但如果应用程序要重复的绘制位图的话,则应该使用BitBlt()函数,因为BitBlt()函数的执行速度要比SetDIBitsToDevice()函数快很多。
设备相关位图 (Device-Dependent Bitmaps) 设备相关位图(DDB)之所以现在还被系统支持,只是为了兼容旧的Windows 3.0软件,如果程序员现在要开发一个与位图有关的程序,则应该尽量使用或生成DIB格式的位图。
DDB位图是被一个单个结构BITMAP所描述,这个结构的成员标明了该位图的宽度、高度、设备的颜色格式等信息。
DDB位图也有两种类型,即:可废弃的(discardable)DDB和不可废弃的(nondiscardable)DDB。可废弃的DDB位图就 是一种当系统内存缺乏,并且该位图也没有被选入设备描述表(DC)的时候,系统就会把该DDB位图从内存中清除(即废弃)。不可废弃的DDB则是无论系统 内存多少都不会被系统清除的DDB。API函数CreateDiscardableBitmap()函数可用于创建可废弃位图。而函数 CreateBitmap()、CreateCompatibleBitmap()、和CreateBitmapIndirect()可用于创建不可废弃
的位图。
应用程序可以通过一个DIB位图而创建一个DDB位图,只要先初始化一些必要的结构,然后再调用CreateDIBitmap()函数就可以。如果在 调用该函数时指定了CBM_INIT标志,那么这一次调用就等价于先调用CreateCompatibleBitmap()创建当前设备格式的DDB位 图,然后又调用SetDIBits()函数转换DIB格式到DDB格式。(可能有些设备并不支持SetDIBits()函数,你可以指定 RC_DI_BITMAP作为RASTERCAPS的标志,然后调用GetDeviceCaps()函数来判断一下)。
对应的数据结构:
1:BMP文件组成
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
2:BMP文件头(14字节)
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:
typedef struct tagBITMAPFILEHEADER
{
WORDbf Type; // 位图文件的类型,必须为BMP(0-1字节)
DWORD bfSize; // 位图文件的大小,以字节为单位(2-5字节)
WORD bfReserved1; // 位图文件保留字,必须为0(6-7字节)
WORD bfReserved2; // 位图文件保留字,必须为0(8-9字节)
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图(10-13字节)
// 文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER; [b]
[/b]
发表评论
-
istream类方法 重载的抽取操作符和 cin输入
2012-01-20 00:12 1053istream类方法 重载的抽 ... -
Windows钩子编程1
2012-01-20 00:12 653Windows钩子编程1 2010年12月29日 一、什 ... -
c语言的文件处理
2012-01-20 00:12 1009c语言的文件处理 2010年06月03日 本章要点: ... -
Linux下文件I/O操作详解
2012-01-20 00:12 683Linux下文件I/O操作详解 2010年12月26日 ... -
java 输入流和输出流概述
2012-01-20 00:12 824java 输入流和输出流概述 2010年12月07日 程 ... -
PHOTOSHOP初学者成长教材
2012-01-19 01:04 607PHOTOSHOP初学者成长教材 ... -
Photoshop初学者必读十课
2012-01-19 01:04 528Photoshop初学者必读十课 2010年06月15日 ... -
诺基亚5800操作
2012-01-19 01:03 582诺基亚5800操作 2011年06月30日 鉴于5800 ... -
2011-3-26
2012-01-19 01:03 5142011-3-26 2011年03月26日 ... -
2011-9-17
2012-01-19 01:03 5142011-9-17 2011年09月17日 ... -
BMP图片结构(一)
2012-01-17 00:26 1076BMP图片结构(一) 2011年05月03日 BMP图 ... -
BMP文件格式及数据提取
2012-01-17 00:26 1073BMP文件格式及数据提取 2011年05月10日 为了给 ... -
BMP文件结构(二)
2012-01-17 00:26 754BMP文件结构(二) 2011年05 ... -
BMP图片是什么格式?
2012-01-17 00:26 874BMP图片是什么格式? 2011 ... -
大全【极有收藏价值的】
2012-01-16 13:52 506大全【极有收藏价值的 ... -
提高小学作文实效性的思考
2012-01-16 13:52 535提高小学作文实效性的思考 2010年11月17日 摘要: ... -
小学生评语大全
2012-01-16 13:51 594小学生评语大全 2011年07月14日 你是一位可爱的小 ... -
小学生期末评语经典大全
2012-01-16 13:51 289小学生期末评语经典大全 2011年12月15日 1.你是 ... -
超级爆笑小学生作文大全,这孩子太搞了
2012-01-16 13:51 471超级爆笑小学生作文大全,这孩子太搞了 2011年11月03日 ...
相关推荐
BMP图片储存格式说明及C代码 BMP(全称Bitmap)是Window操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用...
此文档为BMP格式图片格式的详细解析,可深入了解BMP格式
图片转换工具 jpg .jpeg .gif .png .bmp图片格式 图片格式转换器 格式PNG、JPG、GIF、BMP、tiff互相转换工具
latex入门ppt+bmp图片格式编辑器
PNG图片转换工具. PNG图片转换成BMP图片格式
Java语言读取所有色bmp图片格式,包括1bit 4bit 8bit 24bit,都在BmpUtil这个Java工具类中!
java程序,读取BMP图片的数据存到数组中,利用java类的压缩算法,将BMP图片转换为JPG格式的图片。
利用 C 语言只需两步实现 RAW 格式图片转换成 BMP 格式图片,简单实用容易理解,附代码注释。
可转换图片格式可转换图片格式可转换图片格式可转换图片格式可转换图片格式可转换图片格式
bmp jpg 格式相互转换 运行界面如图 http://hi.csdn.net/attachment/201011/9/0_1289268223N3gt.gif
mnist数据集,已将原始数据修改为图片格式保存,训练集60000张.bmp格式图片,测试集10000张.bmp图片,需要处理代码或者labels标签读取的联系
包括对mnist 手写数据图片中训练图片、训练图片标签、测试图片、测试图片标签的转换,将图片转换为bmp格式,标签为txt格式,
bmp格式的图片解析C语言的实现,把图片文件解析成相应的像素数组
将BMP格式的图片转成PCB文件,可用于图片上的LOGO转成PCB的丝印等,无需安装注册
BMP文件格式详解
用于卷积神经网络CNN的MNIST手写数字图片集,bmp格式,共包含已经分好组的200张图片,共20组,每组0-9 10个数字。
BMP文件结构串口接收的摄像头的十六进制的JPEG数据,如何转换JEPG图片
BMP文件格式详解 BMP文件 BMP 图片格式,包括BMP的头格式,及其意义和作用,指出数据区和文件信息区域。我自己也留着要用好找
在Linux操作系统下,将framebuffer中的缓存数据(也就是raw格式的数据)转换成BMP格式的图片