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