东莞市建设企业网站服务机构,免费客户管理软件排行,书生商友软件下载,jsp网站开发需要哪些技术BMP文件的结构其实非常简单#xff0c;就是两个结构体#xff0b;一个可选的调色板#xff0b;位图数据。第一个结构体是BITMAPFILEHEADER#xff0c;第二个结构体是BITMAPINFOHEADER。然后就是可选的调色板#xff08;RGBQUAD数组#xff09;。最后是位图数据。第一个结… BMP文件的结构其实非常简单就是两个结构体一个可选的调色板位图数据。第一个结构体是BITMAPFILEHEADER第二个结构体是BITMAPINFOHEADER。然后就是可选的调色板RGBQUAD数组。最后是位图数据。第一个结构体这里先讲讲第一个结构体位图文件头结构BITMAPFILEHEADER 的详细结构。先看看代码原型typedef struct tagBITMAPFILEHEADER
{WORD bfType;DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
其中bfType文件的标识值必须是0x4D42也就是“BM”两个字符注意是Little-EndianbfSize是整个文件的大小bfReserved1和bfReserved2必须是0.bfOffBits是位图数据在文件中的偏移。第二个结构体位图信息头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, *PBITMAPINFOHEADER;
biSizeBITMAPINFOHEADER这个结构体的大小。必须为40字节。biWidthBMP位图的宽度。biHeightBMP位图的宽度。这里需要说明一下的是BMP位图数据有两种存储方式通常是“底到上型”也就是BMP位图数据的第一行其实是这个图片的最后一行。一种是“顶到下型”BMP位图数据的第一行就是图片的第一行。如果位图是“顶到下型”那么biHeight的值是负的位图的实际高度其实是(-biHeight)也就是它的相反数。只有“底到上型”位图支持压缩。“底到上型”是目前最常见的位图类型。PhotoShop在保存位图文件的时候你可以设置让它输出“底到上型”或“顶到下型”。“顶到下型”就是“逆行序”。biPlanes位图的“位面数”。这个值必须为1.biBitCount位图的“颜色位数”。表示位图数据中几个二进制位表示一个像素。颜色位数为1表示单色其实是“双色”通常是黑白也可以是别的两个颜色。为2表示四色也就是四种颜色。为4表示16种颜色。为8表示有256种颜色。在表示256色以内的颜色数量的时候这个BMP文件其实是作为使用调色板颜色的图像因此在BITMAPINFOHEADER结构体的后面还有个调色板。所谓调色板其实就是RGBQUAD结构体的数组。它的元素个数就是颜色数。biCompression位图的压缩格式值可以是BI_RGB未压缩BI_RLE88位RLE压缩BI_RLE44位RLE压缩BI_BITFIELDS表示颜色表中每个像素有3个DWORD的屏蔽位数据来指示红绿蓝成分。16位和32位位图可以使用这个。BI_JPEG位图数据其实是JPG格式的BI_PNG位图数据其实是PNG格式的当biCompression值为BI_RLE8的时候biBitCount必须为8表示这是个8位的256色索引颜色位图有256个调色板位图数据按照如下算法压缩·位图数据是每两个字节组成一个元素这样的元素组成了一个数组。·每个元素第一个字节表示重复的像素的数量第二个字节是8位的调色板颜色索引。·如果元素的第一个字节为0那么第二个字节有特殊的含义0这行已经结束了。1这个位图已经结束了。2设置下一个像素的位置后面的两个无符号字节分别指定了下一个像素的X、Y偏移。注意是无符号字节意思是说偏移只能是往后。3到0xFF表示后面有一段没有压缩的数据的长度也就是连续的8位像素颜色索引数据的长度。但是数据必须是2字节对齐的。biCompression值为BI_RLE4的时候biBitCount必须为4表示这是个4位的16色索引颜色位图有16个调色板。和BI_RLE8的区别只是每个元素的第二个字节如果表示颜色索引它表示的是两个像素的颜色索引。第一个字节表示重复的数量第二个字节表示两个像素的颜色。举个例假设调色板第0号色是黑色第1号色是白色元素的值是0x05,0x01那么它表示“黑白黑白黑白黑白黑白”共10个像素出现在1行。biSizeImage位图数据块的大小。以字节为单位。如果你的位图没有经过压缩这个值可以是0.biXPelsPerMeter表示横向的每米的像素数。可以为0.biYPelsPerMeter表示纵向的每米的像素数。可以为0.biClrUsed位图实际使用过的调色板的颜色数。如果这个值为0表示这个位图使用了整个调色板。只有8位以及8位以下的索引颜色位图才需要考虑这个值。对于16位以及16位以上的位图无视这个值。biClrImportant表示重要的颜色数。如果为0表示颜色都重要。通常它的值等于biClrUsed或者等于0.如果位图是8位以及8位以下的位图后面是位图的调色板数据。否则没有调色板数据。调色板就是简单的RGBQUAD数组。后面就是位图数据了。如果位图是没有经过压缩的那么位图数据的存储就是一行一行的每行都是每XX个字节一个像素取决于位图的位数biBitCount每一行都是4字节对齐的多出来的部分用0补齐。这里必须注意。因此每行占用的字节数要按照以下公式计算其中的biBitCount指的是位图的位数也就是BITMAPINFOHEADER的成员每行字节数 ((图像宽度 - 1) * biBitCount / 32 1) * 4;如果你是用VB编写读取位图的话是这样写的每行字节数 ((图像宽度 - 1) * biBitCount \ 32 1) * 4这里还要注意的是“底到上型”位图和“顶到下型”位图如果BITMAPINFOHEADER的biHeight成员大于零那么这个位图就是“底到上型”否则就是“顶到下型”。“底到上型”的位图它的行序是从下到上排列的也就是逆行序。“顶到下型”位图行序是从上到下排列的。位图颜色表位图颜色表就比较简单了typedef struct tagRGBQUAD
{BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;
} RGBQUAD;
红禄蓝三种颜色然后还有保留一个字节。声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。