BMP文件格式
来源:互联网 发布:网络连接错误怎么解决 编辑:程序博客网 时间:2024/05/22 16:57
1、 第一部分为位图文件头BITMAPFILEHEADER,它是一个结构,其定义如下:
typedef struc tagBITMAPFILEHEADER{
WORD bfType;
WORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
WORD bfOffBits;
}BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
该结构的长度是固定的,为14个字节,各个域的说明如下:
Ø bfType:指定文件类型,必须是0x4d42,即字符串“BM”。
Ø bfSize:指定文件大小,包括这14个字节。
Ø bfReserved1,bfReserved2:保留字,为0。
Ø bfOffBits:从文件头到实际的位图数据的偏移字节数,即图1中前三个部分的长度之和。
2、 第二部分为位图信息头BITMAPINFOHEADER,它也是一个结构,其定义如下:
typedef struc tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
该结构的长度也是固定的,为40个字节,各个域的说明如下:
Ø biSize:指定这个结构的长度,为40个字节。
Ø biWidth:指定图像的宽度,单位是象素。
Ø biHeight:指定图像的高度,单位是象素。
Ø biPlanes:必须是1。
Ø biBitCount:指定表示颜色时用到的位数,常用的值为1(黑白二色图)、4(16色图)、8(256色图)、24(真彩色图)。
Ø biCompression:指定位图是否压缩,有效值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS。Windows位图可采用RLE4和RLE8的压缩格式,BI_RGB表示不压缩。
Ø biSizeImage:指定实际的位图数据占用的字节数,可用以下的公式计算出来:
biSizeImage = biWidth’× biHeight
要注意的是:上述公式中的biWidth’必须是4的整数倍(不是biWidth,而是大于或等于biWidth的离4最近的整数倍)。如果biCompression为BI_RGB,则该项可能为0。
Ø biXPelsPerMeter:指定目标设备的水平分辨率。
Ø biYPelsPerMeter:指定目标设备的垂直分辨率。
Ø biClrUsed:指定本图像实际用到的颜色数,如果该值为0,则用到的颜色数为2的biBitCount次幂。
Ø biClrImportant:指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色数都是重要的。
3、 第三部分为调色板。有些位图需要调色板,有些位图,如真彩色图,不需要调色板,
它们的BITMAPINFOHEADER后面直接是位图数据。
调色板实际上是一个数组,共有biClrUsed个元素(如果该值为0,则有2的biBitCount次幂个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:
typedef struct tagRGBQUAD{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
}RGBQUAD;
其中:
Ø rgbBlue:该颜色的蓝色分量。
Ø rgbGreen:该颜色的绿色分量。
Ø rgbRed:该颜色的红色分量。
Ø rgbReserved:保留值。
4、 第四部分就是实际的图像数据。对于用到调色板的位图,图像数据就是该象素颜色
在调色板中的索引值,对于真彩色图,图像数据就是实际的R、G、B值。
Ø 对于2色图,用1位就可以表示该象素的颜色,所以1个字节可以表示8个象素。
Ø 对于16色图,用4位可以表示一个象素的颜色,所以1个字节可以表示2个象素。
Ø 对于256色图,1个字节刚好可以表示1个象素。
Ø 对于真彩色图,3个字节才能表示1个象素。
typedef struc tagBITMAPFILEHEADER{
WORD bfType;
WORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
WORD bfOffBits;
}BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
该结构的长度是固定的,为14个字节,各个域的说明如下:
Ø bfType:指定文件类型,必须是0x4d42,即字符串“BM”。
Ø bfSize:指定文件大小,包括这14个字节。
Ø bfReserved1,bfReserved2:保留字,为0。
Ø bfOffBits:从文件头到实际的位图数据的偏移字节数,即图1中前三个部分的长度之和。
2、 第二部分为位图信息头BITMAPINFOHEADER,它也是一个结构,其定义如下:
typedef struc tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
该结构的长度也是固定的,为40个字节,各个域的说明如下:
Ø biSize:指定这个结构的长度,为40个字节。
Ø biWidth:指定图像的宽度,单位是象素。
Ø biHeight:指定图像的高度,单位是象素。
Ø biPlanes:必须是1。
Ø biBitCount:指定表示颜色时用到的位数,常用的值为1(黑白二色图)、4(16色图)、8(256色图)、24(真彩色图)。
Ø biCompression:指定位图是否压缩,有效值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS。Windows位图可采用RLE4和RLE8的压缩格式,BI_RGB表示不压缩。
Ø biSizeImage:指定实际的位图数据占用的字节数,可用以下的公式计算出来:
biSizeImage = biWidth’× biHeight
要注意的是:上述公式中的biWidth’必须是4的整数倍(不是biWidth,而是大于或等于biWidth的离4最近的整数倍)。如果biCompression为BI_RGB,则该项可能为0。
Ø biXPelsPerMeter:指定目标设备的水平分辨率。
Ø biYPelsPerMeter:指定目标设备的垂直分辨率。
Ø biClrUsed:指定本图像实际用到的颜色数,如果该值为0,则用到的颜色数为2的biBitCount次幂。
Ø biClrImportant:指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色数都是重要的。
3、 第三部分为调色板。有些位图需要调色板,有些位图,如真彩色图,不需要调色板,
它们的BITMAPINFOHEADER后面直接是位图数据。
调色板实际上是一个数组,共有biClrUsed个元素(如果该值为0,则有2的biBitCount次幂个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:
typedef struct tagRGBQUAD{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
}RGBQUAD;
其中:
Ø rgbBlue:该颜色的蓝色分量。
Ø rgbGreen:该颜色的绿色分量。
Ø rgbRed:该颜色的红色分量。
Ø rgbReserved:保留值。
4、 第四部分就是实际的图像数据。对于用到调色板的位图,图像数据就是该象素颜色
在调色板中的索引值,对于真彩色图,图像数据就是实际的R、G、B值。
Ø 对于2色图,用1位就可以表示该象素的颜色,所以1个字节可以表示8个象素。
Ø 对于16色图,用4位可以表示一个象素的颜色,所以1个字节可以表示2个象素。
Ø 对于256色图,1个字节刚好可以表示1个象素。
Ø 对于真彩色图,3个字节才能表示1个象素。
var pic:TPicture; pMem:PByteArray; hFile:Integer; i,ibmpsize,PicW,PicH:Integer; iBytesRead:Integer; lpPalette:pLOGPALETTE; hPal:hPalette;begin pic:=TPicture.Create; //创建Tpicture对象 hFile:=FileOpen(FileName,fmOpenRead); //打开图像数据文件 ibmpsize := FileSeek(hFile,0,2); //获得数据长度 FileSeek(hFile,0,0); //指针移至开始处 pMem:=AllocMem(ibmpsize );//定义pMem维数 iBytesRead:=FileRead(hFile, pMem[0], ibmpsize);//读取数据 FileClose(hFile);//关闭文件 //这里是从图片最后一行读至第一行,你可以加一段调整使之倒过来 //如定义pMem2, pmem2[i]=pmem[1024*768-i]; with pic.Bitmap do begin Height:=768; //图片高 Width:=1024; //图片宽 PixelFormat:=pf1bit; //设置图像的比特深度,2色、8色、256色等 SetBitmapBits( Handle, //handle to bitmap ibmpsize, //number of bytes in bitmap array pMem); //将数据PMem赋给pic end; image1.Height:=picH; image1.Width:=picW; image1.Picture:=pic; //pic赋给image1控件显示 pic.Free; FreeMem(pMem); //以下是更改调色板 image1.Picture.Bitmap.PixelFormat:=pf8bit; GetMem(lpPalette,sizeof(TLogPalette) + (255 * sizeof(TPaletteEntry))); lpPalette^.palVersion := $300; lpPalette^.palNumEntries := 256; for i:=0 to 255 do begin lpPalette^.PalPalEntry[i].peRed :=rr; lpPalette^.PalPalEntry[i].peGreen :=gg; lpPalette^.PalPalEntry[i].peBlue :=bb; end; hPal:=CreatePalette(lpPalette^); image1.Picture.Bitmap.Palette:=hpal; FreeMem(lpPalette,sizeof(TLogPalette) + (255 * sizeof(TPaletteEntry))); DeleteObject(hPal);end;
- BMP文件格式
- BMP文件格式
- BMP文件格式
- BMP文件格式
- bmp 文件格式
- BMP文件格式
- BMP文件格式
- bmp文件格式
- bmp文件格式
- BMP文件格式
- BMP文件格式
- BMP文件格式
- BMP文件格式
- BMP文件格式
- BMP文件格式
- BMP文件格式
- BMP文件格式
- BMP文件格式
- 理解inode
- Android解析XML方式(一)使用SAX解析
- MFC通过对话框窗口句柄获得对话框对象指针
- 使用CXF开发RESTFul服务
- 运行例子以后,能很好的理解spring的反射机制
- BMP文件格式
- Windows获取所有视频文件的扩展名
- 数据库日志文件自动收索
- crontab中的环境变量问题
- 关键字typename
- 常用对象API(基本数据类型对象包装类的概述和字符串转换成基本数值)
- 使用codemirror对xml进行高亮显示
- MyEclipse设置编码方式
- WebRTC