我發現
uj5u.com熱心網友回復:
這很簡單。
24-bpp 影像具有 BGR 格式,32-bpp 影像具有 BGRA 格式,其中 alpha 分量通常不用于任何事情。要使位圖變黑,我們只需忽略 A 組件。
因此,每像素 24 位:
procedure FadeBitmap24(ABitmap: TBitmap);
type
PRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray = array[Word] of TRGBTriple;
var
SL: PRGBTripleArray;
y: Integer;
x: Integer;
begin
ABitmap.PixelFormat := pf24bit;
for y := 0 to ABitmap.Height - 1 do
begin
SL := ABitmap.ScanLine[y];
for x := 0 to ABitmap.Width - 1 do
with SL[x] do
begin
rgbtRed := rgbtRed div 2;
rgbtGreen := rgbtGreen div 2;
rgbtBlue := rgbtBlue div 2;
end;
end;
end;
每像素 32 位:
procedure FadeBitmap32(ABitmap: TBitmap);
type
PRGBQuadArray = ^TRGBQuadArray;
TRGBQuadArray = array[Word] of TRGBQuad;
var
SL: PRGBQuadArray;
y: Integer;
x: Integer;
begin
ABitmap.PixelFormat := pf32bit;
for y := 0 to ABitmap.Height - 1 do
begin
SL := ABitmap.ScanLine[y];
for x := 0 to ABitmap.Width - 1 do
with SL[x] do
begin
rgbRed := rgbRed div 2;
rgbGreen := rgbGreen div 2;
rgbBlue := rgbBlue div 2;
end;
end;
end;
這是直接翻譯。
但是這兩個版本都可以寫得更優雅:
procedure FadeBitmap24(ABitmap: TBitmap);
begin
ABitmap.PixelFormat := pf24bit;
for var y := 0 to ABitmap.Height - 1 do
begin
var SL := PRGBTriple(ABitmap.ScanLine[y]);
for var x := 0 to ABitmap.Width - 1 do
begin
SL.rgbtRed := SL.rgbtRed div 2;
SL.rgbtGreen := SL.rgbtGreen div 2;
SL.rgbtBlue := SL.rgbtBlue div 2;
Inc(SL);
end;
end;
end;
procedure FadeBitmap32(ABitmap: TBitmap);
begin
ABitmap.PixelFormat := pf32bit;
for var y := 0 to ABitmap.Height - 1 do
begin
var SL := PRGBQuad(ABitmap.ScanLine[y]);
for var x := 0 to ABitmap.Width - 1 do
begin
SL.rgbRed := SL.rgbRed div 2;
SL.rgbGreen := SL.rgbGreen div 2;
SL.rgbBlue := SL.rgbBlue div 2;
Inc(SL);
end;
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503910.html
標籤:德尔福 图形 位图图像 delphi-10.3-rio 像素格式
