1

ピクセルに32ビットのTBitmapの特定の色が含まれている場合、アルファコンポーネントの値を変更する必要があります。ビットマップデータにアクセスするためのScanLineプロパティについては知っていますが、それぞれのアルファコンポーネントを変更する方法がわかりません。ピクセル。

4

3 に答える 3

5

これは基本的な実装です

まず、ARGB構造を保持するレコードを定義する必要があります

  TRGB32 = record
    B, G, R, A: byte;
  end;

次に、スキャンラインをキャストして値を取得および設定するために、TRGB32の配列を定義する必要があります。

このサンプルメソッドを確認してください

procedure SetAlphaBitmap(const Dest: TBitmap;Color : TColor;Alpha:Byte);
type
  TRGB32 = record
    B, G, R, A: byte;
  end;
  PRGBArray32 = ^TRGBArray32;
  TRGBArray32 = array[0..0] of TRGB32;
var
  x, y:    integer;
  Line, Delta: integer;
  ColorRGB : TColor;
begin
  if Dest.PixelFormat<>pf32bit then  exit;

  ColorRGB:=ColorToRGB(Color);
  Line  := integer(Dest.ScanLine[0]);
  Delta := integer(Dest.ScanLine[1]) - Line;
  for y := 0 to Dest.Height - 1 do
  begin
    for x := 0 to Dest.Width - 1 do
      if TColor(RGB(PRGBArray32(Line)[x].R, PRGBArray32(Line)[x].G, PRGBArray32(Line)[x].B))=ColorRGB then
        PRGBArray32(Line)[x].A := Alpha;
    Inc(Line, Delta);
  end;
end;

また、 32ビットビットマップを操作するために私が書いたこのユニットを見ることができます

于 2012-04-13T20:41:54.580 に答える
2

32ビットピクセルごとに、最上位バイトにアルファ値が含まれます。

var
  P: Cardinal;
  Alpha: Byte;
...
begin
...
  P := bmp.Canvas.Pixels[x, y];         // Read Pixel
  P := P and $00FFFFFF or Alpha shl 24; // combine your desired Alpha with pixel value
  bmp.Canvas.Pixels[x, y] := P;         // Write back
...
end;
于 2012-04-13T20:40:15.750 に答える
1

私はRRUZの答えに次の微調整を加えます:

procedure SetAlphaBitmap(Dest: TBitmap; Color: TColor; Alpha: Byte); 
type 
  TRGB32 = packed record 
    B, G, R, A: Byte; 
  end; 
  PRGBArray32 = ^TRGBArray32; 
  TRGBArray32 = array[0..0] of TRGB32; 
var 
  x, y: Integer; 
  Line: PRGBArray32; 
  ColorRGB: Longint; 
  Red, Green: Blue: Byte;
begin 
  if Dest.PixelFormat <> pf32bit then Exit; 

  ColorRGB := ColorToRGB(Color); 
  Red := GetRValue(ColorRGB);
  Green := GetGValue(ColorRGB);
  Blue := GetBValue(ColorRGB);

  for y := 0 to Dest.Height - 1 do 
  begin 
    Line := PRGBArray32(Dest.ScanLine[y]);
    for x := 0 to Dest.Width - 1 do
    begin
      with Line[x] do
      begin
        if (R = Red) and (G = Green) and (B = Blue) then 
          A := Alpha; 
      end;
    end;
  end; 
end; 
于 2012-04-13T23:11:25.803 に答える