问题
我正在尝试将32x32磁贴从a复制TBitmap到TPaintbox我的地图编辑器中,但我似乎无法使透明度正常工作.
见下图:
注意:出于演示和测试的目的,我在TPaintbox下面放置了一个TImage,这有助于查看透明度是否有效.

如您所见,常规瓷砖绘制正确,但应该是透明的瓷砖是用白色背景绘制的.
我现在正在使用适当的类来管理我的地图和图块,下面是我尝试绘制的两种方法:
CopyRect:
procedure TMap.DrawTile(Tileset: TBitmap; MapX, MapY, TileX, TileY: Integer;
MapCanvas: TCanvas);
begin
if TileIsFree(MapX, MapY) then
begin
MapCanvas.CopyRect(
Rect(MapX, MapY, MapX + fTileWidth, MapY + fTileHeight),
Tileset.Canvas,
Rect(TileX, TileY, TileX + fTileWidth, TileY + fTileHeight));
end;
end;
Run Code Online (Sandbox Code Playgroud)
的BitBlt
procedure TMap.DrawTile(Tileset: TBitmap; MapX, MapY, TileX, TileY: Integer;
MapCanvas: TCanvas);
begin
if TileIsFree(MapX, MapY) then
begin
BitBlt(
MapCanvas.Handle,
MapX,
MapY,
fTileWidth,
fTileHeight,
Tileset.Canvas.Handle,
TileX,
TileY,
SRCCOPY);
end;
end;
Run Code Online (Sandbox Code Playgroud)
我已经尝试为tileset使用位图和png图像格式(屏幕截图上的左图).位图和png之间的唯一区别是,CopyRect当它是png时,很难绘制甚至几个图块,但BitBlt设法绘制没有任何明显的缺点.
无论如何,如何TBitmap在TPaintbox不丢失透明度的情况下复制/绘制部分a ,或者在我的情况下不复制白色背景?
更新1
继下面的一些评论后,我尝试调用该AlphaBlend函数,但这仍然会产生不良结果(请注意透明区域周围的蓝色):
procedure TMap.DrawTile(Tileset: Graphics.TBitmap; MapX, MapY, TileX, TileY: Integer;
MapCanvas: TCanvas);
var
BlendFn: TBlendFunction;
begin
if TileIsFree(MapX, MapY) then
begin
BlendFn.BlendOp := AC_SRC_OVER;
BlendFn.BlendFlags := 0;
BlendFn.SourceConstantAlpha := 255;
BlendFn.AlphaFormat := AC_SRC_ALPHA;
AlphaBlend(
MapCanvas.Handle,
MapX,
MapY,
fTileWidth,
fTileHeight,
Tileset.Canvas.Handle,
TileX,
TileY,
fTileWidth,
fTileHeight,
BlendFn);
end;
end;
Run Code Online (Sandbox Code Playgroud)

谢谢.
有 3 种流行的方法来处理透明位图,前两种使用标准 Delphi 工具,第三种需要第三方库:
\n\n如果您使用两种标准方法之一,请不要使用 BitBlt 或 CopyRect。使用透明图像容器的 Draw 方法在目标画布上绘图。
\n\n| 归档时间: |
|
| 查看次数: |
1946 次 |
| 最近记录: |