4

質問

コントロールのキャンバスにピクセルごとのアルファを持つビットマップを描画する最良の方法は何ですか?

私のビットマップ データは、32 ビット ピクセル値の 2 次元配列に格納されています。

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

私のコントロールはTCustomTransparentControlの子孫です。

バックグラウンド

私が構築している GUI では、他のコントロールやテクスチャ背景の上に半透明のコントロールを描画する必要があります。コントロール グラフィックスは、AggPasMod (Anti-Grain Geometry のポート) を使用して作成されます。

TCustomTransparentControl.Canvas.Handle は描画用のデバイス コンテキストへのアクセスを提供しますが、そこからピクセル データをブリットする方法がわかりません。

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 に答える