delphi - 如何在无需先绘制的情况下获得位图透明度?

标签 delphi bitmap transparency

默认情况下,新创建的位图似乎具有(白色)背景。至少,对 Pixels 属性的查询证实了这一点。但是为什么当 Transparent 设置为 true 时,背景颜色不用作透明颜色?

考虑这个简单的测试代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    Bmp.Width := 100;
    Bmp.Height := 100;
    Bmp.Transparent := True;
    Canvas.Draw(0, 0, Bmp);                              // A white block is drawn
    Bmp.Canvas.Brush.Color := Bmp.Canvas.Pixels[0, 99];  // = 'clWhite'
    Bmp.Canvas.FillRect(Rect(0, 0, 100, 100));
    Canvas.Draw(0, 100, Bmp);                            // "Nothing" is drawn
  finally
    Bmp.Free;
  end;
end;

出于某种原因,必须先绘制整个位图表面,然后才能显示为透明,这听起来有点奇怪。

以下变体尝试消除对 FillRect 的调用,所有变体都具有相同的结果(无透明度):

  • 仅设置Brush.Color
  • Brush.Handle := CreateSolidBrush(clWhite),
  • PixelFormat := pf32Bit,
  • IgnorePalette := True,
  • 透明颜色 := clWhite,
  • TransparantMode := tmFixed,
  • Canvas.Pixels[0, 99] := clWhite 仅使该像素透明,
  • 修改:= True

因此,我们的愿望是仅绘制新创建的位图的一部分,并使其余表面透明。

使用:Delphi 7、Win 7/64。

最佳答案

在设置位图尺寸之前,只需设置TransparentColor 和 Canvas.Brush.Color。

关于delphi - 如何在无需先绘制的情况下获得位图透明度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7732435/

相关文章:

delphi - 如何删除 TStringGrid 行?

delphi - 如何在 Windows 7 x64 上调试 delphi 7 中的 dll?

java - 从 url 加载位图太慢

html - 如何使SVG的透明部分可点击?

ffmpeg 将白色转换为 alpha

delphi - 德尔福ABS功能失效

delphi - GDI+ DrawLine 什么都不画

java - 位图代替 Drawable

javascript - 在纯 Javascript 中创建 Canvas /位图(无 html)

cocoa - OSX El Capitan 上的透明 NSWindow