① linux平台下 OPENGL 贴图问题 我希望读取BMP图片 并贴图在一个矩形上 但是现在贴图效果很差。。。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
试试看复,制图像长宽最好是2的幂。
② 悬赏问题:在TQ2440开发板linux中怎样用一个函数读取bmp格式图片中一个像素点的色彩信息
这个需要了解 BMP图片的格式。每一个像素点都是 由4个字节表示版的,所权以只要读取4个字节 然后根据不同的格式 转化一下就可以得到 RGB 的三原色了。
例如: 如 一张bmp 是24位真彩色的,那读取后面的实际数据 第一个 4字节数据就是 (0,0)像素点 ,可以得到它的 三原色值。后面的像素点一次类推 往后每增加 一个像素点就读下一个 4字节数据。
③ 如何制作位图(.bmp)文件
可以用photoshop打开JPG文件,然后另存为bmp文件。此外,windows自带的附件中的画图软件,也可以把图片直接保存为bmp格式的,不知是否对楼主有用?
④ linux中怎么将文件压缩成.bmp.gz文件
如果希望压到特定的目录下:tar -cvzf /绝对路径/my.tar.gz /root/*.bmp
⑤ linux 平台下有没有BMP图片解码库
参考:http://www.cnblogs.com/shengansong/archive/2011/09/23/2186409.html
http://code.google.com/p/libbmp/
说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP。由于没有经过任何的压缩,故BMP图 片往往很大。在Windows下,任何格式的图片文件都要转化为位图格式才能显示出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生 成的。
一、下面我们来看看位图文件(*.BMP)的格式。
位图文件主要分为如下4个部分:
块名称
对应Windows结构体定义 大小(Byte)
文件信息头 BITMAPFILEHEADER 14
位图信息头 BITMAPINFOHEADER 40
颜色表(调色板)RGBQUAD(可选)
位图数据(RGB颜色阵列) BYTE* 由图像长宽尺寸决定
1.文件信息头BITMAPFILEHEADER
结构体定义如下:
typedef struct tagBITMAPFILEHEADER {
UINT bfType;
Dword bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
其中:
bfType 表示文件的类型,该值必需是0x4D42,也就是字符'BM'。
bfSize 表示该位图文件的大小,用字节为单位
bfReserved1 保留,必须设置为0
bfReserved2保留,必须设置为0
bfOffBits 表示从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头
和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。
2、位图信息头BITMAPINFOHEADER
结构体定义如下:
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
其中:
biSize 表示BITMAPINFOHEADER结构所需要的字节数。
biWidth 表示图象的宽度,以象素为单位。
biHeight 表示图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。
如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。
biPlanes为目标设备说明位面数,其值将总是被设为1。
biBitCount表示比特数/象素,其值为1、4、8、16、24、或32。但是由于我们平时用到的图像绝大部分是24位和32位的,所以我们讨论这两类图像。
biCompression 表示图象数据压缩的类型,同样我们只讨论没有压缩的类型:BI_RGB。
biSizeImage表示图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0。
biXPelsPerMeter表示水平分辨率,用象素/米表示。
biYPelsPerMeter表示垂直分辨率,用象素/米表示。
biClrUsed表示位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。
biClrImportant 表示对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。
3、颜色表RGBQUAD:
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。 这个部分是可选的,有些位图需要颜色表,有些位图,比如真彩色图(24位的BMP)就不需要颜色表,因为位图中的RGB值就代表了每个象素的颜色。但是16位r5g6b5位域彩色图像需要颜色表。
RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue;// 蓝色的亮度(值范围为0-255)
BYTE rgbGreen; // 绿色的亮度(值范围为0-255)
BYTE rgbRed; // 红色的亮度(值范围为0-255)
BYTE rgbReserved;// 保留,必须为0
} RGBQUAD;
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
} BITMAPINFO;
而文件信息头和位图信息组成位图文件,BITMAPFILE结构定义如下:
typedef struct tagBITMAP
{
BITMAPFILEHEADER bfHeader;
BITMAPINFO biInfo;
}BITMAPFILE;
4. 位图数据(RGB颜色阵列)
位图数据记录了位图的每一个像素值,记录顺序是:扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节;
当biBitCount=32时,1个像素占4个字节;
Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。
这部分就是图片真正的数据,比如一张图片的大小为800*600,则该部分数据的长度就应该为800*600像素,也即800*600*24/8字节(如果是24位的图片,即一个像素用24bit来存储,每个像素点上有3个字节,分别用来表示b,g,r的颜色)。
有关RGB三色空间我想大家都很熟悉,这里我想说的是在Windows下,RGB颜色阵列存储的格式其实BGR。也就是说,对于24位的RGB位图像素数据格式是:
蓝色B值
绿色G值
红色R值
对于32位的RGB位图像素数据格式是:
蓝色B值
绿色G值
红色R值
透明通道A值
透明通道也称Alpha通道,该值是该像素点的透明属性,取值在0(全透明)到255(不透明)之间。对于24位的图像来说,因为没有Alpha通道,故整个图像都不透明。
二.根据对BMP格式的说明,我们可以轻易的写出一个生成BMP图像的函数:
首先需要位图数据,然后加上文件信息头和位图信息头就可以构成一张BMP图片了。
注意1:biBitCount与颜色表
biBitCount=1 表示位图最多有两种颜色,缺省情况下是黑色和白色,你也可以自己定义这两种颜色。图像信息头装调色板中将有两个调色板项,称为索引0和索引1。图象数据阵列中的每一位表示一个象素。如果一个位是0,显示时就使用索引0的RGB值,如果位是1,则使用索引1的RGB值。
biBitCount=4 表示位图最多有16种颜色。每个象素用4位表示,并用这4位作为彩色表的表项来查找该象素的颜色。例如,如果位图中的第一个字节为0x1F,它表示有两个 象素,第一象素的颜色就在彩色表的第2表项中查找,而第二个象素的颜色就在彩色表的第16表项中查找。此时,调色板中缺省情况下会有16个RGB项。对应 于索引0到索引15。
biBitCount=8 表示位图最多有256种颜色。每个象素用8位表示,并用这8位作为彩色表的表项来查找该象素的颜色。例如,如果位图中的第一个字节为0x1F,这个象素的颜色就在彩色表的第32表项中查找。此时,缺省情况下,调色板中会有256个RGB项,对应于索引0到索引255。
biBitCount=16 表示位图最多有65536种颜色。每个色素用16位(2个字节)表示。这种格式叫作高彩色,或叫增强型16位色,或64K色。它的情况比较复杂,当 biCompression成员的值是BI_RGB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分 量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555 16位位图。如果biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据, 称为红、绿、蓝掩码。分别用于描述红、绿、蓝分量在16位中所占的位置。在Windows 95(或98)中,系统可接受两种格式的位域:555和565,在555格式下,红、绿、蓝的掩码分别是:0x7C00、0x03E0、0x001F,而 在565格式下,它们则分别为:0xF800、0x07E0、0x001F。你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色 分量(当然还要再经过适当的左右移操作)。在NT系统中,则没有格式限制,只不过要求掩码之间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不 过因为它的显示效果接近于真彩,而图像数据又比真彩图像小的多,所以,它更多的被用于游戏软件)。
biBitCount=24 表示位图最多有1670万种颜色。这种位图没有调色板(bmiColors成员尺寸为0),在位数组中,每3个字节代表一个象素,分别对应于颜色R、G、B。
biBitCount=32 表示位图最多有2^32种颜色。这种位图的结构与16位位图结构非常类似,当biCompression成员的值是BI_RGB时,它也没有调色板,32 位中有24位用于存放RGB值,顺序是:最高位—保留,红8位、绿8位、蓝8位。这种格式也被成为888 32位图。如果 biCompression成员的值是BI_BITFIELDS时,原来调色板的位置将被三个DWORD变量占据,成为红、绿、蓝掩码,分别用于描述红、 绿、蓝分量在32位中所占的位置。在Windows 95(or 98)中,系统只接受888格式,也就是说三个掩码的值将只能是:0xFF0000、0xFF00、0xFF。而在NT系统中,你只要注意使掩码之间不产 生重叠就行。(注:这种图像格式比较规整,因为它是DWORD对齐的,所以在内存中进行图像处理时可进行汇编级的代码优化(简单))。
注意2:字节补齐
位图数据记录了位图的每一个像素值,记录顺序是:扫描行内是从左到右,扫描行之间是从下到上。且Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,所以向文件中写入的位图数据的大小应该为:
每行图像的字节数:bmppitch = ((biWidth * bitCountPerPix + 31) >> 5) << 2;
例如:一张24位10*10的图片,一行图像10个像素,共30字节,由于Windows规定一个扫描行所占的字节数必须是4的倍数,而不足的以0填充, 所以一行图像在文件中实际存储了32个字节(补了2字节的0);而图片总的大小就不是54+30*10=354字节,而是54+32*10=374字节。 (见图:24-10-10.bmp)
所以:1. 在生成BMP文件时,如果一行图像的字节数不是4的倍数,则补0,而补后一行图像数据的大小的计算公式为:
bmppitch = ((biWidth * bitCountPerPix + 31) >> 5) << 2;
其中,biWidth--图片的宽度,bitCountPerPix--图片的位数。
⑥ linux下用C语言生成一个rgb888的BMP图片,为什么生成了,打开的时候(图片浏览软件)提示头文件有错
第一眼看到Aspire one happy小?就?得?是一台女生?想要?有的??,蛋?,原因?他,桃?????,就是他漂亮的四色外?,??窗,?然?摸之后??得塑?感有?重,嘉?????,不?亮?的外型搭上1.15kg?巧?重,台中?款,10.1?的?幕不??小,台南????,又能放?手提包中方便??,舞蹈服?,其?是取其平衡的做法。
?用Atom Dual-core N550、1G???是小??很一般的?格,??使用Office或是上???影片,玩一些小????是措措有?。?建W7 Starter及Android??系?,?是能??使用者快速??和上?。
【硬???介?】
▲前正面。
▲右?面分?有SD卡插槽、耳?孔、USB及?路孔。
▲左?面分???源孔、D-sub及??USB。
完整?容??考 MML行?生活?:Aspire one happy ?系?的粉嫩小??
⑦ 如何制作Bitmap(bmp)文件
注:本文参考了林福宗老师的有关BMP文件格式的文章,在此声明。
简介
BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
6.1.2 文件结构
位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。
位图文件的组成 结构名称 符号
位图文件头(bitmap-file header)BITMAPFILEHEADERbmfh
位图信息头(bitmap-information header)BITMAPINFOHEADERbmih
彩色表(color table)RGBQUADaColors[]
图象数据阵列字节BYTEaBitmapBits[]
位图文件结构可综合在表6-01中。
表01 位图文件结构内容摘要
偏移量 域的名称 大小 内容
图象文件
头0000h文件标识2 bytes两字节的内容用来识别位图的类型:
‘BM’ : Windows 3.1x, 95, NT, …
‘BA’ :OS/2 Bitmap Array
‘CI’ :OS/2 Color Icon
‘CP’ :OS/2 Color Pointer
‘IC’ : OS/2 Icon
‘PT’ :OS/2 Pointer
注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。
0002hFile Size1 dword用字节表示的整个文件的大小
0006hReserved1 dword保留,必须设置为0
000AhBitmap Data Offset1 dword从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量
000EhBitmap Header Size1 dword位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:
28h - Windows 3.1x, 95, NT, …
0Ch - OS/2 1.x
F0h - OS/2 2.x
注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。
0012hWidth1 dword位图的宽度,以象素为单位
0016hHeight1 dword位图的高度,以象素为单位
001AhPlanes1 word位图的位面数(注:该值将总是1)
图象
信息
头
001ChBits Per Pixel1 word每个象素的位数
1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)
4 - 16 色位图
8 - 256 色位图
16 - 16bit 高彩色位图
24 - 24bit 真彩色位图
32 - 32bit 增强型真彩色位图
001EhCompression1 dword压缩说明:
0 - 不压缩 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
0022hBitmap Data Size1 dword用字节数表示的位图数据的大小。该数必须是4的倍数
0026hHResolution1 dword用象素/米表示的水平分辨率
002AhVResolution1 dword用象素/米表示的垂直分辨率
002EhColors1 dword位图使用的颜色数。如8-比特/象素表示为100h或者 256.
0032hImportant Colors1 dword指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
调色板数据根据BMP版本的不同而不同PaletteN * 4 byte调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值: 1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)
图象数据根据BMP版本及调色板尺寸的不同而不同Bitmap Dataxxx bytes该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。
构件详解
1. 位图文件头
位图文件头包含有关于文件类型、文件大小、存放位置等信息,在Windows 3.0以上版本的位图文件中用BITMAPFILEHEADER结构来定义:
typedef struct tagBITMAPFILEHEADER { /* bmfh */
UINT bfType;
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
其中:
bfType说明文件的类型.(该值必需是0x4D42,也就是字符'BM'。我们不需要判断OS/2的位图标识,这么做现在来看似乎已经没有什么意义了,而且如果要支持OS/2的位图,程序将变得很繁琐。所以,在此只建议你检察'BM'标识)
bfSize说明文件的大小,用字节为单位
bfReserved1保留,必须设置为0
bfReserved2保留,必须设置为0
bfOffBits说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。
2. 位图信息头
位图信息用BITMAPINFO结构来定义,它由位图信息头(bitmap-information header)和彩色表(color table)组成,前者用BITMAPINFOHEADER结构定义,后者用RGBQUAD结构定义。BITMAPINFO结构具有如下形式:
typedef struct tagBITMAPINFO { /* bmi */
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
其中:
bmiHeader说明BITMAPINFOHEADER结构,其中包含了有关位图的尺寸及位格式等信息
bmiColors说明彩色表RGBQUAD结构的阵列,其中包含索引图像的真实RGB值。
BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和颜色格式,其结构定义为:
typedef struct tagBITMAPINFOHEADER { /* bmih */
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
其中:
biSize说明BITMAPINFOHEADER结构所需要的字数。注:这个值并不一定是BITMAPINFOHEADER结构的尺寸,它也可能是sizeof(BITMAPV4HEADER)的值,或是sizeof(BITMAPV5HEADER)的值。这要根据该位图文件的格式版本来决定,不过,就现在的情况来看,绝大多数的BMP图像都是BITMAPINFOHEADER结构的(可能是后两者太新的缘故吧:-)。
biWidth说明图象的宽度,以象素为单位
biHeight说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。(注:当高度值是一个负数时(正向图像),图像将不能被压缩(也就是说biCompression成员将不能是BI_RLE8或BI_RLE4)。
biPlanes为目标设备说明位面数,其值将总是被设为1
biBitCount说明比特数/象素,其值为1、4、8、16、24、或32
biCompression说明图象数据压缩的类型。
⑧ 扩展名为BMP的位图文件是什么文件怎么在文件夹中创建
扩展名为BMP的位图文件:是Windows操作系统所推荐和支持的图像文件格式。是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,所以称为位图(bitmap)文件。因其文件扩展名为BMP,故称为BMP文件格式,简称BMP文件。
BMP位图文件创建:
1、首先,在Photoshop中新建一个空白图层,并填充前景色。
2、然后,点击“文件”将其存储为bmp格式。
3、最后,选择24位图保存即可。
BMP文件结构:BMP图像文件被分成四个部分,位图文件头(Bitmap
File
Header)、位图信息头(Bitmap
Info
Header)、颜色表(Color
Map)和位图数据(即图像数据,Data
Bits或Data
Body)。
⑨ 在EXAM的文件夹中创建一个空白的BMP文件,文件名为嘟嘟,怎么做呢 把步骤写下来把
你好朋友;
bmp也就是所说的位图文件;
BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,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. 用第一个返回值除以第二个返回值。即:GetDeviceCaps(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文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:
{WORDbfType;//位图文件的类型,必须为BM(1-2字节)DWORDbfSize;//位图文件的大小,以字节为单位(3-6字节,低位在前)WORDbfReserved1;//位图文件保留字,必须为0(7-8字节)WORDbfReserved2;//位图文件保留字,必须为0(9-10字节)DWORDbfOffBits;//位图数据的起始位置,以相对于位图(11-14字节,低位在前)//文件头的偏移量表示,以字节为单位}BITMAPFILEHEADER;
3:位图信息头(40字节)
BMP位图信息头数据用于说明位图的尺寸等信息。
{DWORDbiSize;//本结构所占用字节数(15-18字节)LONGbiWidth;//位图的宽度,以像素为单位(19-22字节)LONGbiHeight;//位图的高度,以像素为单位(23-26字节)WORDbiPlanes;//目标设备的级别,必须为1(27-28字节)WORDbiBitCount;//每个像素所需的位数,必须是1(双色),(29-30字节)//4(16色),8(256色)16(高彩色)或24(真彩色)之一DWORDbiCompression;//位图压缩类型,必须是0(不压缩),(31-34字节)//1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一DWORDbiSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)LONGbiXPelsPerMeter;//位图水平分辨率,每米像素数(39-42字节)LONGbiYPelsPerMeter;//位图垂直分辨率,每米像素数(43-46字节)DWORDbiClrUsed;//位图实际使用的颜色表中的颜色数(47-50字节)DWORDbiClrImportant;//位图显示过程中重要的颜色数(51-54字节)}BITMAPINFOHEADER;
4:颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:
typedefstructtagRGBQUAD{BYTErgbBlue;//蓝色的亮度(值范围为0-255)BYTErgbGreen;//绿色的亮度(值范围为0-255)BYTErgbRed;//红色的亮度(值范围为0-255)BYTErgbReserved;//保留,必须为0}RGBQUAD;
颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
当biBitCount=1,4,8时,分别有2,16,256个表项;
当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedefstructtagBITMAPINFO{BITMAPINFOHEADERbmiHeader;//位图信息头RGBQUADbmiColors[1];//颜色表}BITMAPINFO;
5:位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节,按顺序分别为B,G,R;
Windows规定一个扫描行所占的字节数必须是
4的倍数(即以long为单位),不足的以0填充,
biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;
具体数据举例:
如某BMP文件开头:
424D 46900000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F0000 0000 00000000 0000*00F8 E007 1F00 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....
读取方法
/*
功能:在图片的第50行画一条黑线
为简化代码,只支持24位色的图片
codeblocks下正确运行。VC下需要将二维数组img改为malloc动态分配。需要添加#include "stdlib.h"。
*/
#include<stdio.h>#include<windows.h>typedefstruct{BYTEb;BYTEg;BYTEr;}RGB;intmain(void){BITMAPFILEHEADERfileHeader;BITMAPINFOHEADERinfoHeader;FILE*pfin=fopen("原始图像.bmp","rb");FILE*pfout=fopen("修改后的图像.bmp","wb");//ReadtheBitmapfileheader;fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);//ReadtheBitmapinfoheader;fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);//为简化代码,只处理24位彩色if(infoHeader.biBitCount==24){intsize=infoHeader.biWidth*infoHeader.biHeight;RGBimg[infoHeader.biHeight][infoHeader.biWidth];fread(img,sizeof(RGB),size,pfin);//把第50行染成黑色inti=0;for(;i<infoHeader.biWidth;i++){img[50][i].b=img[50][i].g=img[50][i].r=0;}//将修改后的图片保存到文件fwrite(&fileHeader,sizeof(fileHeader),1,pfout);fwrite(&infoHeader,sizeof(infoHeader),1,pfout);fwrite(img,sizeof(RGB),size,pfout);}fclose(pfin);fclose(pfout);}
文件部分
图像文件头
1)1-2:(这里的数字代表的是字节,下同)图像文件头。0x4d42=’BM’,表示是Windows支持的BMP格式。(注意:查ascii表B 0x42,M0x4d,bfType 为两个字节,B为low字节,M为high字节所以bfType=0x4D42,而不是0x424D,请注意)
2)3-6:整个文件大小。4690 0000,为00009046h=36934。
3)7-8:保留,必须设置为0。
4)9-10:保留,必须设置为0。
5)11-14:从文件开始到位图数据之间的偏移量(14+40+4*(2^biBitCount))(在有颜色板的情况下)。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
位图信息头
6)15-18:位图图信息头长度。
7) 19-22:位图宽度,以像素为单位。8000 0000,为00000080h=128。
8)23-26:位图高度,以像素为单位。9000 0000,为00000090h=144。
9)27-28:位图的位面数,该值总是1。0100,为0001h=1。
10)29-30:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=16。
11)31-34:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为00000003h=3(这张图片不存在颜色板)。
12)35-38:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于:一行所占的字节数×位图高度。0090 0000为00009000h=80×90×2h=36864。假设位图是24位,宽为41,高为30,则数值= (biWidth*biBitCount+31)/32*4*biHeight,即=(41*24+31)/32*4*30=3720
13)39-42:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。
14)43-46:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=4000。
15)47-50:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。
16)51-54:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。
彩色板
17)(55+0)到(50-1+2^biBitCount):彩色板规范。对于调色板中的每个表项,用下述方法来描述RGB的值:
1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)
对于24-位真彩色图像就不使用彩色板,因为位图中的RGB值就代表了每个象素的颜色。
如,彩色板为00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00F8为F800h = 1111 1000 0000 0000(二进制),是蓝色分量的掩码。
E007 为 07E0h = 0000 0111 1110 0000(二进制),是绿色分量的掩码。
1F00为001Fh = 0000 0000 0001 1111(二进制),是红色分量的掩码。
0000 总设置为0。
将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩码,就可以明白事实上在每个像素值的两个字节16位中,按从高到低取5、6、5位分别就是r、g、b分量值。取出分量值后把r、g、b值分别乘以8、4、8就可以补齐第个分量为一个字节,再把这三个字节按rgb组合,放入存储器(同样要反序),就可以转换为24位标准BMP格式了。
图像数据阵列
18)55(无调色板)-bfSize:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。
//----图像处理-----BMP为DIB类型,从底向上显示---------
//阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。
//下面的代码可以完成第一个字节表示位图左上角的象素,而最后一个字节表示位图右下角的象素,即正常的显示状态,便于操作。
int m,n;
unsigned char k;
m = BMPPIC.BMPInfoHead.biWidth/8; //24
n = BMPPIC.BMPInfoHead.biHeight; //96, 24*96 = 2304 bytes
for(int i=0; i < n/2; i++ )
{
for(int a=0; a < m; a++ )
{
k = pbufout1[m*(n-i-1) + a];
pbufout1[m*(n-i-1) + a] = pbufout1[i*m + a];
pbufout1[i*m + a] = k;
}
}
存储算法
BMP文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多。例如,一个800×600的24位几乎占据1.4MB空间。因此它们通常不适合在因特网或者其它低速或者有容量限制的媒介上进行传输。根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由n/8所确定(n是位深度,1字节包含8个数据位)。图片浏览器等基于字节的ASCII值计算像素的颜色,然后从调色板中读出相应的值。更为详细的信息请参阅下面关于位图文件的部分。n位2n种颜色的位图近似字节数可以用下面的公式计算:BMP文件大小约等于 54+4*2的n次方+(w*h*n)/8,其中高度和宽度都是像素数。需要注意的是上面公式中的54是位图文件的文件头,是彩色调色板的大小。另外需要注意的是这是一个近似值,对于n位的位图图像来说,尽管可能有最多2n中颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于。如果想知道这些值是如何得到的,请参考下面文件格式的部分。由于存储算法本身决定的因素,根据几个图像参数的不同计算出的大小与实际的文件大小将会有一些细小的差别。
数据类型
Oracle产品 EPC Bitmap 中数据类型 EPC bitmap的缩写。
Oracle提出了一种EPC bitmap的数据类型对基于RFID产品项级别跟踪应用产生的大量的数据进行有效处理,。
EPC bitmap数据类型定义一个EPC集合,集合共享EPC的一些特征(例如header,manager number,and object class)。支持这个数据类型的关键是使用RFID标识的物品项,在一个群组里可以基于共同属性(例如位置,截止日期,或制造商),在通常情况下可以被追踪。而EPC集合可以表示为一个EPC bitmap,bitmap可以被访问并可通过epc2bmp或bmp2epc进行数据类型的转换操作。
引入EPC bitmap(epc bmp)类型的好处:
(1)可以简单的标识一个RFID EPC集合,而不会丢失任何信息;
(2)对于同类的EPC操作可以简单的在bitmap上操作,简化了操作方式