如何将每像素alpha的位图绘制到控件的Canvas上?

Sha*_*ews 4 windows delphi graphics user-interface delphi-xe2

将每像素alpha位图绘制到控件的画布上的最佳方法是什么?

我的位图数据存储在32位像素值的2d数组中.

T32BitPixel = packed record
    Blue  : byte;
    Green : byte;
    Red   : byte;
    Alpha : byte;
end;
Run Code Online (Sandbox Code Playgroud)

我的控制是TCustomTransparentControl的后代.

背景

对于我正在构建的GUI,我需要在其他控件和纹理背景上绘制半透明控件.使用AggPasMod(Anti-Grain Geometry的一个端口)创建控制图形.

TCustomTransparentControl.Canvas.Handle提供了对绘图设备上下文的访问,但我不知道如何从那里blit像素数据.

TLa*_*ama 7

假设你的像素数组像图像行和像素一样,我会这样做.该Canvas参数是目标画布,X并且Y是坐标,其中位图将在目标画布中呈现,并且Pixels是像素数组:

type
  TPixel = packed record
    B: Byte;
    G: Byte;
    R: Byte;
    A: Byte;
  end;
  TPixelArray = array of array of TPixel;

procedure RenderBitmap(Canvas: TCanvas; X, Y: Integer; Pixels: TPixelArray);
var
  I: Integer;
  Size: Integer;
  Bitmap: TBitmap;
  BlendFunction: TBlendFunction;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.PixelFormat := pf32bit;
    Bitmap.Width := Length(Pixels[0]);
    Bitmap.Height := Length(Pixels);
    Size := Bitmap.Width * SizeOf(TPixel);

    for I := 0 to Bitmap.Height - 1 do
      Move(Pixels[I][0], Bitmap.ScanLine[I]^, Size);

    BlendFunction.BlendOp := AC_SRC_OVER;
    BlendFunction.BlendFlags := 0;
    BlendFunction.SourceConstantAlpha := 255;
    BlendFunction.AlphaFormat := AC_SRC_ALPHA;
    AlphaBlend(Canvas.Handle, X, Y, Bitmap.Width, Bitmap.Height,
      Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, BlendFunction);
  finally
    Bitmap.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)