Недавно я столкнулся с ситуацией, когда мне нужно было записать счетчик для изображения, используемого для панели навигации, где изображение было получено из компонента списка изображений.
После нескольких часов работы над мозгом, просматривая другие статьи, такие как:
Как загрузить прозрачное изображение из ImageList?
*. Bmp теряет прозрачный фон при использовании 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 .
OK. Нет проблем. Просто используйте белый в качестве цвета прозрачности ...
Неа. Несмотря на то, что Canvas.Pixels[0, 31]
отображал 16777215 в качестве цвета, что соответствует значению clWhite , использование его для TransparentColour не имело никакого эффекта.
Чтобы понять, что я имею в виду, создайте новое приложение VCL Forms в Delphi, добавьте пару TButtons и TImageList и свяжите вторую кнопку со списком изображений с помощью настройка кнопок Изображения в конструкторе. Дважды щелкните первую кнопку и установите код события следующим образом:
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», но все, что было прозрачным, теперь белое.