我先申请一块内存,然后赋值作为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中显示一幅纯粹的黄色的位图。
哪个人能帮我解释一下这个问题。

解决方案 »

  1.   

    先赋值然后再CreateBitmap,是创建了BMP的格式,剩下的数据作为颜色值。如果你先创建CreateBitmap,再赋值时应该是把格式那块值都给冲掉了,整个就不是一个BMP图了,不知我说的对不对。
      

  2.   

    你在用ScanLine的時候,並沒有指定bmp的格式修正如下:
      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;