我最近遇到一种情况,我需要为用于导航栏的图像写一个计数器,该图像来自图像列表组件。
绞尽脑汁几个小时后,再看其他文章,例如:
How to load a transparent Image from ImageList?
*.bmp loses transparent background if using v6 ImageList Control
http://codeverge.com/embarcadero.delphi.graphics/timage-is-not-transparent-after-a/1080826
http://www.efg2.com/Lab/Library/Delphi/Graphics/ICOtoBMP.pas.txt
我选择了一种解决方案,该解决方案从图像列表中复制位图,将文本写入位图画布,然后将位图放回图像列表中。
唯一的问题是我失去了透明度,而且我一生都无法弄清楚如何找回。
如果我使用GetIcon而不是GetBitmap,则可以提取并重新分配图像,包括透明度,但是我没有Canvas才能使用TextOut。
如果我设置颜色以使图像在链接到图像列表的组件(如导航栏)中看起来正确,则当使用GetBitmap提取图像时,透明度会丢失,并且直接应用于 TImage 。
好。没问题。只需使用白色作为透明色...
不。尽管Canvas.Pixels[0, 31]
显示的颜色为16777215,与 clWhite 的值相同,但对 TransparentColour 使用该颜色无效。
要了解我的意思,请在Delphi中创建一个新的VCL Forms应用程序,放置几个 TButtons 和一个 TImageList ,然后将第二个按钮链接到图像通过在设计器中设置按钮 Images 属性列出。双击第一个按钮,并将事件代码设置为:
procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap : TBitMap;
begin
Bitmap := TBitmap.Create;
try
ImageList1.GetBitmap(0, BitMap);
BitMap.Canvas.Brush.Style := bsClear;
BitMap.Canvas.Font.Size := 10;
BitMap.Canvas.Font.Color := clBlack;
BitMap.Canvas.Font.Style := [fsBold];
BitMap.Canvas.TextOut(8, 0, '100');
Bitmap.Transparent := True;
Bitmap.TransParentColor := Bitmap.Canvas.Pixels[0, 31]; // Bottom left
ImageList1.ReplaceMasked(0, BitMap, Bitmap.TransParentColor);
finally
Bitmap.Free;
end;
end;
现在将非透明位图添加到图像列表中(根据需要更改大小。我使用32x32像素位图)。默认情况下,该组件将透明颜色显示为左下方像素。保持原样,然后确定图像列表更改。将第二个按钮的 ImageIndex 更改为0。
现在您应该看到添加到第二个按钮上显示的图像列表中的位图,无论透明颜色是透明的。
现在单击第一个按钮。第二个按钮上的图像更改为显示“ 100”,但是透明的现在变为白色。
答案 0 :(得分:0)
解决方案是在添加图像时更改 TImageList UI上的透明颜色。我发现最好在颜色列表底部附近选择 clNone 。这样可以确保在将位图添加到图像列表时,不会对位图应用透明度。
这意味着图像列表中的位图显示了其“背景”,设计器中第二个按钮上的图像也显示了该颜色,但是,当单击第一个按钮时,图像将变为带有“ 100“,但现在已应用透明度。
这是因为从Canvas.Pixels[0, 31]
返回的颜色值是实际的颜色值,而不是一些看起来像16777215但实际上不是的伪内部填充材料。这样, ReplaceMasked 调用即可正常工作。