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

正如您所看到的,常规瓷砖的绘制是正确的,但是应该透明的瓷砖是用白色的背景绘制的。
我现在正在使用适当的类来管理我的地图和瓷砖,下面是我尝试绘制的两种方法:
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;我已经尝试使用位图和png图像格式的tileset (屏幕截图上的左图像)。位图和png之间唯一的区别是,当CopyRect是png时,它甚至很难画出几块瓷砖,但是BitBlt设法画的没有任何明显的缺点。
无论如何,如何在不丢失透明度的情况下将TBitmap的一部分复制/绘制到TPaintbox上,或者在我的情况下不复制白色背景?
更新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;

谢谢。
发布于 2016-12-07 22:36:28
有三种常用的使用透明位图的方法,前两种使用标准Delphi工具,第三种需要第三方库:
如果使用两种标准方法之一,则不要使用BitBlt或CopyRect。使用透明图像保持架的绘制方法在目标画布上绘制。
https://stackoverflow.com/questions/25577387
复制相似问题