簡體   English   中英

使用DrawText和GDI +創建透明的字形

[英]Create glyph transparent using DrawText with GDI+

我正在嘗試創建一個函數來創建TBitmap。 此位圖將是帶有透明背景的字形,並且它只是Wingdings字體的一個字符。

之后,我將使用此標志符號將其分配給TBitBtn(按鈕)。

這是我當前的代碼:

function CreateTransparent(aChar: Char; aFontSize, aWidth, aHeight: Integer; aColor: TColor): TBitmap;

  function _GPColor(Col: TColor): TGPColor;
  begin
    Result := ColorRefToARGB(ColorToRGB(Col));
  end;

var
  f: TGPFont;
  r, rTx: TGPRectF;
  b: TGPSolidBrush;
  c: TGPGraphics;
  tx: TGPStringFormat;
  bt: TGPBitmap;
  h: HBITMAP;
  bk, fg: Cardinal;
  s: string;
  attr: TGPImageAttributes;
begin
  s := aChar;
  fg := _GPColor(aColor);

  bt := TGPBitmap.Create(abs(aWidth), aHeight, PixelFormat32bppARGB);
  try
    c := TGPGraphics.Create(bt);

    f := TGPFont.Create('Wingdings', aFontSize, FontStyleRegular, UnitPixel);
    b := TGPSolidBrush.Create( MakeColor(0, 0, 0, 0) );
    tx := TGPStringFormat.Create;
    try
      // configura o device
      tx.SetLineAlignment(StringAlignmentCenter);

      r.X := 0;
      r.Y := 0;
      r.Width := 2000;
      r.Height := aHeight;

      c.MeasureString(WideString(s), -1, f, r, rTx);
      if (aWidth < 0) and (rTx.Width > Abs(aWidth)) then
      begin
        c.Free;
        bt.Free;

        aWidth := Ceil(rTx.Width);

        bt := TGPBitmap.Create(aWidth, aHeight, PixelFormat32bppARGB);
        c := TGPGraphics.Create(bt);
      end;

      c.SetTextRenderingHint(TextRenderingHintAntiAlias);

      // inicializa as variáveis
      r.X := 0;
      r.Y := 0;
      r.Width := bt.GetWidth;
      r.Height := bt.GetHeight;

      // escreve o texto
      b.SetColor(fg);

      c.DrawString(WideString(s), -1, f, r, tx, b);
    finally
      f.Free;
      b.Free;
      tx.Free;
      c.Free;
    end;

    Result := TBitmap.Create;
    if bt.GetHBITMAP(0, h)= ok then
      TBitmap(Result).Handle := h;
  finally
    bt.Free;
  end;
end;

用法:

myGlyph := CreateTransparent('N', 14, 16, 16, clGray);

問題:

生成的位圖不透明,背景變為黑色!

有人可以告訴我我需要做什么來“填充”透明背景嗎?

據我了解,您希望位圖的背景透明嗎? 如果是這樣,你需要使用alpha通道的位圖..默認情況下,背景色為黑色,所以你只需要設置的屬性AlphaFormat你的位圖的afDefined

...
Result := TBitmap.Create;
Result.AlphaFormat := afDefined;
if bt.GetHBITMAP(0, h) = ok then
  TBitmap(Result).Handle := h;
...

這是結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM