BMP文件格式

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个象素。 
 
  1. var  
  2.   pic:TPicture;  
  3.   pMem:PByteArray;  
  4.   hFile:Integer;  
  5.   i,ibmpsize,PicW,PicH:Integer;  
  6.   iBytesRead:Integer;  
  7.   lpPalette:pLOGPALETTE;  
  8.   hPal:hPalette;  
  9. begin  
  10.   pic:=TPicture.Create;  //创建Tpicture对象   
  11.   hFile:=FileOpen(FileName,fmOpenRead); //打开图像数据文件   
  12.   ibmpsize := FileSeek(hFile,0,2); //获得数据长度   
  13.   FileSeek(hFile,0,0); //指针移至开始处   
  14.   pMem:=AllocMem(ibmpsize );//定义pMem维数   
  15.   iBytesRead:=FileRead(hFile, pMem[0], ibmpsize);//读取数据   
  16.   FileClose(hFile);//关闭文件   
  17.   //这里是从图片最后一行读至第一行,你可以加一段调整使之倒过来   
  18.   //如定义pMem2, pmem2[i]=pmem[1024*768-i];   
  19.   with pic.Bitmap do begin  
  20.     Height:=768//图片高   
  21.     Width:=1024//图片宽   
  22.     PixelFormat:=pf1bit; //设置图像的比特深度,2色、8色、256色等   
  23.     SetBitmapBits(  
  24.     Handle, //handle to bitmap   
  25.     ibmpsize, //number of bytes in bitmap array   
  26.     pMem); //将数据PMem赋给pic   
  27.   end;  
  28.   image1.Height:=picH;  
  29.   image1.Width:=picW;  
  30.   image1.Picture:=pic;  //pic赋给image1控件显示   
  31.   pic.Free;  
  32.   FreeMem(pMem);  
  33.   
  34.   //以下是更改调色板   
  35.   image1.Picture.Bitmap.PixelFormat:=pf8bit;  
  36.   GetMem(lpPalette,sizeof(TLogPalette) + (255 * sizeof(TPaletteEntry)));  
  37.   lpPalette^.palVersion := $300;  
  38.   lpPalette^.palNumEntries := 256;  
  39.   for i:=0 to 255 do begin  
  40.     lpPalette^.PalPalEntry[i].peRed :=rr;  
  41.     lpPalette^.PalPalEntry[i].peGreen :=gg;  
  42.     lpPalette^.PalPalEntry[i].peBlue :=bb;  
  43.   end;  
  44.   hPal:=CreatePalette(lpPalette^);  
  45.   image1.Picture.Bitmap.Palette:=hpal;  
  46.   FreeMem(lpPalette,sizeof(TLogPalette) + (255 * sizeof(TPaletteEntry)));  
  47.   DeleteObject(hPal);  
  48. end;  
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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值