При работе с изображениями в программировании на Delphi часто возникает задача сохранения альфа-прозрачности при передаче изображений из TImageList в TImage. Особенно это актуально для изображений с альфа-каналом, таких как PNG с 32-битной глубиной цвета.
Проблема
Пользователь столкнулся с необходимостью извлечения изображения из TImageList и его размещения в TImage (или возвратом в виде TGraphic). Важно, что TImageList может содержать изображения с альфа-прозрачностью, и цель состоит в том, чтобы получить одно из таких альфа-проницаемых изображений и разместить его в TImage. Это предполагает, что в какой-то момент потребуется TGraphic.
Решение
Для решения задачи пользователь предложил функцию GetImageListImageIntoImage, которая должна была взять изображение из TImageList и поместить его в TImage. Однако, методы GetIcon и GetBitmap из TCustomImageList не сохраняют альфа-канал, что является основной проблемой.
Подтвержденный Ответ
Для сохранения альфа-прозрачности при работе с TImageList и TImage в Delphi 2010, следует использовать следующий подход:
function ImageListGetGraphic(ImageList: TCustomImageList; ImageIndex: Integer): TGraphic;
var
ico: HICON;
wi: TWicImage;
begin
ico := ImageList_GetIcon(ImageList.Handle, ImageIndex, ILD_NORMAL);
wi := TWicImage.Create;
OleCheck(TWicImage.ImagingFactory.CreateBitmapFromHICON(ico, wi.Handle));
DestroyIcon(ico);
Result := wi;
end;
procedure GetImageListImageIntoImage(SourceImageList: TCustomImageList; ImageIndex: Integer; TargetImage: TImage);
var
g: TGraphic;
begin
g := ImageListGetGraphic(SourceImageList, ImageIndex);
TargetImage.Picture.Graphic := g; // Присваивание TGraphic выполняет копирование
g.Free;
end;
Пример использования:
var
g: TGraphic;
begin
g := ImageListGetGraphic(ImageList1, 7);
Image1.Picture.Graphic := g;
g.Free;
end;
Альтернативный Ответ
Также можно использовать следующий код для получения изображения из TImageList с сохранением альфа-прозрачности:
function ImageListGetGraphic(ImageList: TCustomImageList; ImageIndex: Integer): TGraphic;
var
ico: HICON;
begin
ico := ImageList_GetIcon(ImageList.Handle, ImageIndex, ILD_NORMAL);
Result := TWicGraphic.FromHICON(ico);
DestroyIcon(ico);
end;
Важные Моменты
При работе с альфа-прозрачными изображениями важно использовать методы, которые поддерживают сохранение альфа-канала.
В Delphi 2010 для работы с альфа-прозрачными изображениями можно использовать компоненты TWicGraphic и TWicImage, которые предоставляют более широкие возможности по сравнению с стандартными TBitmap и TIcon.
При использовании TWicImage следует учитывать возможные ошибки VCL, например, необходимо создать экземпляр TWicImage до попытки доступа к ImagingFactory.
Таким образом, при правильном подходе, можно сохранить альфа-прозрачность изображений при их передаче между TImageList и TImage в среде Delphi 2010.
Вопрос связан с сохранением альфа-прозрачности при работе с компонентами `TImage` и `TImageList` в Delphi 2010.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.