问题
我正在尝试将TBitmap
中的32x32磁贴复制到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;
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;
我尝试过为tileset使用位图和png图像格式(截图上的左图)。位图和png之间的唯一区别是CopyRect
在png时很难绘制几个图块,但是BitBlt
设法绘制时没有任何明显的缺点。
无论如何,如何在不失去透明度的情况下将TBitmap
的一部分复制/绘制到TPaintbox
,或者在没有复制白色背景的情况下如何复制/绘制?{/ p>
更新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;
感谢。
答案 0 :(得分:0)
有三种流行的方法可以使用透明位图,前两种使用标准的Delphi工具,第三种需要第三方库:
如果您使用两种标准方法之一,请不要使用BitBlt或CopyRect。使用透明图像持有者的Draw方法在目标画布上绘制。