BMP文件的处理!
这是数据结构:
BITMAPFILEHEADER=tagBITMAPFILEHEADER;
tagBITMAPFILEHEADER=RECORD //BMP文件头结构
bfType:word; //位图文件类型,必须为BM
bfSize:LongWord; //位图文件大小,以字节为单位
bfReserved1:word; //位图文件保留字,必须为0
bfReserved2:word; //位图文件保留字,必须为0
bfOffBits:Longword; //位图文件的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
END;
BITMAPINFOHEADER=tagBITMAPINFOHEADER;
tagBITMAPINFOHEADER=RECORD //位图信息头结构
biSize:longword; //本结构所占用字节数
biWidth:longint; //位图的宽度,以像素为单位
biHeight:longint; //位图的高度,以像素为单位
biPlanes:word; //目标设备的级别,必须为0
biBitCount:word; //每个像素所需的位数,必须是1(双色),4(16色),8(256色),24(真彩色)之一
biCompression:longword; // 位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型)或者2(BI_RLE4压缩类型)之一
biSezeImage:longword; //位图的大小,以字节为单位
biXPelsPerMeter:Longword; //位图水平分辨率,每米像素
biYPelsPerMeter:Longword; //位图垂直分辨率,每米像素
biClrUsed:longword; //位图实际使用的颜色表中的颜色数
biClrImportant:longword; //位图显示过程中重要的颜色数。
END;
RGBQUAD=tagRGBQUAD;
tagRGBQUAD=RECORD //颜色表结构
rgbBlue:Byte; //蓝色的亮度(0-255)
rgbGreen:Byte; //绿色的亮度(0-255)
rgbRed:Byte; //红色的亮度(0-255)
rgbReserved:Byte; //保留,必须为0
END;
TFileHeader=Record
Header:BITMAPFILEHEADER;
InfoHeader:BITMAPINFOHEADER;
End;
BmpFileInfo=Record
FileHeader:TFileHeader;
ColorTable:Array [0..255] Of RGBQUAD;
ColorCount:Word;
Data:byte;
End;
var
FBMP: TFBMP;
FpHeader:file of TFileHeader;// BITMAPFILEHEADER;
FPColorTable:File Of RGBQUAD;
FPData:File Of Byte;
BmpFile:BmpFileInfo;
BitMapBuffer:Array [1..800*3,1..600*3] Of Byte;
ColorTable:Array[1..16777216] Of TColor;
问题点数:0、回复次数:3Top
1 楼jtg98g3(跳舞的青蛙)回复于 2005-06-02 19:52:24 得分 0
这是处理代码:
procedure TFBMP.Button1Click(Sender: TObject);
Var
ColorIndex,ColorCount:Integer;
X1,Y1:LongWord;
begin
If OPD.Execute Then
Begin
assignfile(FpHeader,OPD.FileName);
Reset(FpHeader);
Read(FpHeader,BMPFile.FileHeader);
closeFile(FpHeader);
case BMPFile.FileHeader.InfoHeader.biBitCount of
1: BMPFile.ColorCount:=2;
4: BMPFile.ColorCount:=16;
8: BMPFile.ColorCount:=256;
24: BMPFile.ColorCount:=0 ;
else ;
end;
assignfile(FPColorTable,OPD.FileName);
Reset(FPColorTable);
For ColorIndex:=0 To BMPFile.ColorCount-1 Do
Begin
Read(FPColorTable,BMPFile.ColorTable[colorIndex]);
End;//For ColorIndex=1 To ColorCountDo
closeFile(FPColorTable);
AssignFile(FPData,OPD.FileName);
Reset(FPData);
Seek(FPData,BMPFile.FileHeader.Header.bfOffBits+1);
For Y1:=1 To BMPFile.FileHeader.InfoHeader.biHeight Do
Begin
For X1:=1 To BMPFile.FileHeader.InfoHeader.biWidth*(BMPFile.FileHeader.InfoHeader.biBitCount div 8) Do
Begin
Application.ProcessMessages;
If Eof(FPData) Then
Begin
self.Caption :='File End.'+'Form Width:'+IntToStr(Self.Width)+' Height:'+IntToStr(Self.Height);
End
Else
Begin
Read(FPData,BitMapBuffer[X1,Y1]);
End;
End;//For X
End;//For Y
For Y1:=1 To BMPFile.FileHeader.InfoHeader.biHeight Do
Begin
For X1:=1 To BMPFile.FileHeader.InfoHeader.biWidth*(BMPFile.FileHeader.InfoHeader.biBitCount div 8) Do
Begin
Application.ProcessMessages;
self.SetFocus;
case BMPFile.FileHeader.InfoHeader.biBitCount of
8:
Begin
With BMPFile.ColorTable[BitMapBuffer[X1,BMPFile.FileHeader.InfoHeader.biHeight-Y1+1]] Do
begin
Self.Canvas.Pixels[X1,Y1]:=RGB(rgbRed,rgbGreen,rgbBlue);
Self.Canvas.Pixels[X1+1,Y1]:=RGB(BMPFile.ColorTable[0].rgbRed,BMPFile.ColorTable[0].rgbGreen,BMPFile.ColorTable[0].rgbBlue);
End;
End;
24:
Begin
If (X1 Mod 3=0) Then
Begin
Self.Canvas.Pixels[(X1 div 3),Y1 ]:=RGB(BitMapBuffer[X1-1,BMPFile.FileHeader.InfoHeader.biHeight-Y1+1],BitMapBuffer[X1-2,BMPFile.FileHeader.InfoHeader.biHeight-Y1+1],BitMapBuffer[X1,BMPFile.FileHeader.InfoHeader.biHeight-Y1+1]);
End;
End;
end;
End;//For X
End;//For Y
CloseFile(FPData);
End;//If OPD.Execute Then
end;Top
2 楼jtg98g3(跳舞的青蛙)回复于 2005-06-02 19:55:42 得分 0
是在delphi7.0 ,win2000pro下编程的。
结果在处理8位(256色)bmp图像的时候,出现了问题。不能正常显示。颜色偏红色!
每个像素的rgb值都跟看图软件上的像素的rgb值不同!
请问这是什么问题?是调色板用错了吗?调色板是直接从位图数据中读取到的。听说要用系统的调色板!?请问该怎么用?
Top
3 楼jtg98g3(跳舞的青蛙)回复于 2005-06-03 09:46:47 得分 0
斑竹在吗?能帮我个忙,帮我看看吗?在delphi中,如何将bmp的调色板转换成系统的调色板?
Top




