我先申请一块内存,然后赋值作为Bmp的象素数据。填充$00FFFF00,大概是黄色。然后CreateBitmap(201,200,1,32,pb),pb就是这块象素数据,然后显示,在窗体上,可以正确显示一块201X200的黄色区域。程序如下:
pb := AllocMem(201*200*4);
pdword := Pointer(pb);
for i := 0 to 201*200 - 1 do
begin
pdword^ := $00FFFF00;
inc(pdword);
end;
hBmp := CreateBitmap(201,200,1,32,pb);
bmp := TBitmap.Create;
bmp.Handle := hBmp;
Image1.Canvas.Draw(0,0,bmp);
bmp.Free;
FreeMem(pb);
但是,如果我先CreateBitmap,然后用bmp.ScanLine[i],逐行进行赋值$00FFFF00,却发现无法显示黄色。代码如下:
hBmp := CreateBitmap(201,200,1,32,nil);
bmp := TBitmap.Create;
bmp.Handle := hBmp;
for i := 0 to bmp.Height - 1 do
begin
pdword := bmp.ScanLine[i];
for j := 0 to bmp.Width - 1 do
begin
pdword^ := $00FFFF00;
inc(pdword);
end;
end;
Image1.Canvas.Draw(0,0,bmp);
但是如果同是上面这段代码,我不用逐行填充,用
bmp.Canvas.Brush.Style := bsSolid;
bmp.Canvas.Brush.Color := $00FFFF00;
bmp.Canvas.FillRect(r);
然后在用Image1.Canvas.Draw(0,0,bmp);
却又可以在Image1中显示一幅纯粹的黄色的位图。
哪个人能帮我解释一下这个问题。
pb := AllocMem(201*200*4);
pdword := Pointer(pb);
for i := 0 to 201*200 - 1 do
begin
pdword^ := $00FFFF00;
inc(pdword);
end;
hBmp := CreateBitmap(201,200,1,32,pb);
bmp := TBitmap.Create;
bmp.Handle := hBmp;
Image1.Canvas.Draw(0,0,bmp);
bmp.Free;
FreeMem(pb);
但是,如果我先CreateBitmap,然后用bmp.ScanLine[i],逐行进行赋值$00FFFF00,却发现无法显示黄色。代码如下:
hBmp := CreateBitmap(201,200,1,32,nil);
bmp := TBitmap.Create;
bmp.Handle := hBmp;
for i := 0 to bmp.Height - 1 do
begin
pdword := bmp.ScanLine[i];
for j := 0 to bmp.Width - 1 do
begin
pdword^ := $00FFFF00;
inc(pdword);
end;
end;
Image1.Canvas.Draw(0,0,bmp);
但是如果同是上面这段代码,我不用逐行填充,用
bmp.Canvas.Brush.Style := bsSolid;
bmp.Canvas.Brush.Color := $00FFFF00;
bmp.Canvas.FillRect(r);
然后在用Image1.Canvas.Draw(0,0,bmp);
却又可以在Image1中显示一幅纯粹的黄色的位图。
哪个人能帮我解释一下这个问题。
hBmp := CreateBitmap(201,200,1,32,nil);
bmp := TBitmap.Create;
bmp.Handle := hBmp;
//下面這句很重要
bmp.PixelFormat := pf32bit;
for i := 0 to bmp.Height - 1 do
begin
pdword := bmp.ScanLine[i];
for j := 0 to bmp.Width - 1 do
begin
pdword^ := $00FFFF00;
inc(pdword);
end;
end;
//bmp.SaveToFile('c:\001.bmp');
Image1.Canvas.Draw(0,0,bmp);
bmp.Free;