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

时间:2012-12-18 01:39:08

标签: windows delphi user-interface graphics delphi-xe2

问题

在控件的Canvas上使用每像素alpha绘制位图的最佳方法是什么?

我的位图数据存储在32位像素值的二维数组中。

T32BitPixel = packed record
    Blue  : byte;
    Green : byte;
    Red   : byte;
    Alpha : byte;
end;

我的控制权是TCustomTransparentControl的后代。

背景

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

TCustomTransparentControl.Canvas.Handle提供了对device context进行绘图的访问,但我不确定如何从那里blit像素数据。

1 个答案:

答案 0 :(得分:7)

假设您的像素数组像图像行和像素一样,我会这样做。 Canvas参数是目标画布,XY是坐标,其中位图将在目标画布中呈现,Pixels是像素数组:< / p>

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;