这行代码中的ByteCount 作如何解释!!! ( 积分: 100 )

  • 主题发起人 主题发起人 liwenbin
  • 开始时间 开始时间
L

liwenbin

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
fileheader:TBitmapFileHeader;
infoheader:TBitmapInfoHeader;
stream:TFileStream;
localbmp:TBitmap;
linelen:integer;
clipleft,cliptop,clipwidth,clipheight:integer;
i:integer;
begin
Self.DoubleBuffered:=true;
cliptop:=0;
clipleft:=0;
clipwidth:=Image1.Width;
clipheight:=Image1.Height;
stream:=TFileStream.Create('test.bmp',fmopenread or fmsharedenywrite);
localbmp:=TBitmap.Create;
stream.Read(fileheader,sizeof(TBitmapFileHeader));
stream.Read(infoheader,sizeof(TBitmapinfoHeader));
localbmp.Width:=clipwidth;
localbmp.Height:=clipheight;
localbmp.PixelFormat:=pf24Bit;

linelen:=(ByteCount * infoheader.biHeight +3) shr 2 shl 2;


for i:= cliptop to cliptop + clipheight -1 do
begin
stream.Position:=integer(fileheader.bfOffBits)+ linelen *(infoheader.biHeight-1-i)+
byteCount * clipleft
stream.Read(localbmp.scanline[i-cliptop]^,clipwidth * byteCount );
end;
Image1.Picture.Assign(localbmp);


end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
fileheader:TBitmapFileHeader;
infoheader:TBitmapInfoHeader;
stream:TFileStream;
localbmp:TBitmap;
linelen:integer;
clipleft,cliptop,clipwidth,clipheight:integer;
i:integer;
begin
Self.DoubleBuffered:=true;
cliptop:=0;
clipleft:=0;
clipwidth:=Image1.Width;
clipheight:=Image1.Height;
stream:=TFileStream.Create('test.bmp',fmopenread or fmsharedenywrite);
localbmp:=TBitmap.Create;
stream.Read(fileheader,sizeof(TBitmapFileHeader));
stream.Read(infoheader,sizeof(TBitmapinfoHeader));
localbmp.Width:=clipwidth;
localbmp.Height:=clipheight;
localbmp.PixelFormat:=pf24Bit;

linelen:=(ByteCount * infoheader.biHeight +3) shr 2 shl 2;


for i:= cliptop to cliptop + clipheight -1 do
begin
stream.Position:=integer(fileheader.bfOffBits)+ linelen *(infoheader.biHeight-1-i)+
byteCount * clipleft
stream.Read(localbmp.scanline[i-cliptop]^,clipwidth * byteCount );
end;
Image1.Picture.Assign(localbmp);


end;
 
这是一个在其他地方定义的变量,也许是个常量.你需要看看它的值是在那里取得的.
我猜想ByteCount应该为1/2/3/4的值,对应于 8/16/24/32位色。
 
但上面的代码编译不了!!!
 
我的解释:一个数值。
 
Copy的代码不全吧?肯定是个其他地方定义过的常量或赋值过的变量。
 
应该是 zjan521 的说法。这是一段 DIB 位图的读取代码。DIB 头中有个 biBitCount 字段,表示位图中用多少 bit 字节表示一个像素点。 ByteCount 应是 biBitCount div 8 的值。这里可能不需要处理 1bit(2色)/4bit(16色)位图,仅处理 8bit 整数倍的位数。


>&gt
linelen:=(ByteCount * infoheader.biHeight +3) shr 2 shl 2;

这里好像有个错误: biHeight 应为 biWidth 才对。

linelen 这句的意思是:位图中每行像素所占用的字节数。DIB 标准中每行像素以 4 字节对齐。所以需要用一点技巧转换一下。

所以对于 8/24位写法应该是:
LineLen := (ByteCount * InfoHeader.biWidth + 3) div 4 * 4;

如果要处理所有色彩位数的可以这样写:
LineLen := (InfoHeader.biBitCount * InfoHeader.biWidth + 31) div 32 * 4;
 
[red]ByteCount另外有定义吧?[/red]
 
接受答案了.
 
后退
顶部