Sha*_*ews 4 windows delphi graphics user-interface delphi-xe2
题
将每像素alpha位图绘制到控件的画布上的最佳方法是什么?
我的位图数据存储在32位像素值的2d数组中.
T32BitPixel = packed record
Blue : byte;
Green : byte;
Red : byte;
Alpha : byte;
end;
Run Code Online (Sandbox Code Playgroud)
我的控制是TCustomTransparentControl的后代.
背景
对于我正在构建的GUI,我需要在其他控件和纹理背景上绘制半透明控件.使用AggPasMod(Anti-Grain Geometry的一个端口)创建控制图形.
TCustomTransparentControl.Canvas.Handle提供了对绘图设备上下文的访问,但我不知道如何从那里blit像素数据.
假设你的像素数组像图像行和像素一样,我会这样做.该Canvas参数是目标画布,X并且Y是坐标,其中位图将在目标画布中呈现,并且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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
773 次 |
| 最近记录: |