PNG в Delphi 2009 Изображения и изображения - PullRequest
4 голосов
/ 10 февраля 2009

D2009 представляет поддержку PNG для изображений и списков изображений.

Однако ...

У меня есть список изображений, содержащий PNG изображения с альфа-каналом. Я хочу поместить один из них в форму, используя TImage. Как я могу это сделать и получить изображение, красиво скомпонованное?

В качестве примера проблемы, с которой я сталкиваюсь, приведенный ниже код не работает правильно и дает показанный эффект:

ImageList.GetBitmap(index, Image1.Picture.Bitmap);

alt text
(источник: clip2net.com )

Чтобы объяснить немного больше:

Перетащите Timage на форму и во время разработки загрузите файл PNG с альфа-каналом, используя свойство Picture. Обратите внимание, как он правильно составлен с полной прозрачностью формы.

Теперь, во время разработки, добавьте второй пустой Timage, добавьте TImagelist и добавьте тот же PNG в список изображений. Как я могу назначить PNG в TImageList второму TImage, и чтобы он выглядел идентично первому?

Ответы [ 6 ]

4 голосов
/ 16 февраля 2009

Из моего исследования я обнаружил, что TImageList хранит изображения как TBitmaps, поэтому альфа-информация теряется в хранилище, и вы не можете достичь того, что ищете, с текущей реализацией TImageList.

Обновление:

Немного больше экспериментов, и с кодом ниже я могу заставить прозрачность работать с кодом ниже.

ImageList1.ColorDepth := cd32Bit;
Image2.Transparent := True;
Image2.Canvas.Pen.Style := psClear;
Image2.Canvas.Rectangle(0, 0, Image2.Width+1, Image2.Height+1);
ImageList1.Draw(Image2.Canvas, 0,0,0);

Но он выглядел не так красиво, как загруженный png.

2 голосов
/ 09 сентября 2010

Установите флажок Включить темы времени выполнения на вкладке
. Проект -> Параметры -> Вкладка приложения

Это решило мою проблему для меня в RAD Studio 2010.

1 голос
/ 13 февраля 2009

Я наткнулся на эту ветку обсуждения:

Прозрачные PNG в D2009 TImageList

@ Пекка Найссонен: установка ColorDepth на cd32Bit и DrawingStyle на dsTransparent работал на меня.

У меня нет доступа к delphi 2009, поэтому я не пробовал его, хотя ...

1 голос
/ 13 февраля 2009

Я только что попробовал простой тест. TImageList содержит изображение PNG с прозрачностью. Я отрисовываю изображение на втором изображении, используя:

imlImageList.Draw (img2.Canvas, 0, 0, 0);

Для меня было важно установить img2.Transparent: = true (я использовал конструктор, а не код).

0 голосов
/ 19 февраля 2009

Насколько мне известно, это не может быть достигнуто. Ни одно из приведенных предложений не приводит к правильному альфа-смешанному изображению, что является основным требованием.

Возможно, определив класс, производный от TImageList, который может затем обращаться к защищенным методам, что-то можно заставить работать. Мое решение на данный момент - использовать сторонний пользовательский компонент ImageList специально для этого.

0 голосов
/ 14 февраля 2009

Существует несколько способов добавить прозрачные изображения в список изображений.

С помощью AddMasked или InsertMasked вы добавляете изображение и отмечаете цвет прозрачным:

procedure InsertMasked(Index: Integer; Image: TBitmap; MaskColor: TColor);
function AddMasked(Image: TBitmap; MaskColor: TColor): Integer;

С помощью кнопки «Добавить» или «Добавить» вы добавляете изображение и маску. Маска, если используется 2-цветное (черно-белое) изображение, в котором используются только белые пиксели изображения, остальные являются прозрачными.

function Add(Image, Mask: TBitmap): Integer;
procedure Insert(Index: Integer; Image, Mask: TBitmap);
...