4

问题

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

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

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

我的控件是TCustomTransparentControl的后代。

背景

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

TCustomTransparentControl.Canvas.Handle 提供对设备上下文的访问以进行绘图,但我不确定如何从那里对像素数据进行 blit。

4

1 回答 1

7

假设您的像素阵列像其中的图像行和像素一样组成,我会这样做。Canvas参数是目标画布,和XY坐标,位图将在目标画布中渲染,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;
于 2012-12-18T03:07:10.987 回答