Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.10.08;
Скачать: CL | DM;

Вниз

Иконки в TImage из Imagelist, теряется прозрачность   Найти похожие ветки 

 
Dmitry   (2015-11-07 21:06) [0]

Доброго времени суток, Уважаемые.
Необходимо динамически создавать Image на ScrollBox и загружать иконки из Imagelist. В Imagelist загружены файлы ico 64x64.

 ImageList1.BkColor := clNone;
 ImageList1.BlendColor := clNone;
 ImageList1.DrawingStyle := dsTransparent;
 ImageList1.ImageType := itImage;
 ImageList1.Masked := false
 ImageList1.ShareImages := true;

Делаю так

var ImagesArray: Array of TImage;
...
 SetLength(ImagesArray, High(ImagesArray)+1);
 ImagesArray[High(ImagesArray)] := TImage.Create(ScrollBox1);
 with ImagesArray[High(ImagesArray)] do
  begin
   Left := X;
   Top := Y;
   Height := 64;
   Width := 64;
   ShowHint := true;
   Tag := High(ImagesArray); // Для дальнейшей индексации
   Parent := ScrollBox1;
   Transparent := true;
   NodeMainImageList.GetIcon(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Icon);
   Repaint;
  end;

получаю картинку на черном фоне. Если сопоставляю не TIcon а TBitmap

   NodeMainImageList.GetBitmap(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Bitmap);

получаю картинку на белом фоне.
Что не так делаю ?


 
Dmitry   (2015-11-07 21:13) [1]

Исправление:

ImageList1.GetIcon(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Icon);


ImageList1.GetBitmap(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Bitmap);


 
han_malign ©   (2015-11-10 12:32) [2]


>  ImageList1.Masked := false


ILC_MASK - Use a mask. The image list contains two bitmaps, one of which is a monochrome bitmap used as a mask. If this value is not included, the image list contains only one bitmap.

ILD_TRANSPARENT - Draws the image transparently using the mask, regardless of the background color. This value has no effect if the image list does not contain a mask.


 
Dmitry   (2015-11-11 20:14) [3]

Нет у меня в Delphi7 параметра ILD_TRANSPARENT при методе ImageList1.Draw, поэтому

ImageList1.Draw(ImagesArray[High(ImagesArray)].Canvas, 0, 0, tNodeData.VisualParam.MainImage_Index, ILD_TRANSPARENT);

не получается.
Сделал так. Конвертировал ico в bmp при помощи http://image.online-convert.com/ru и оставил

ImageList1.GetIcon(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Icon);

Всё работает. Пока не пойму почему, но работает.


 
han_malign ©   (2015-11-12 17:09) [4]


> > ImageList1.Masked := false

- это означает, что при вызове  ImageList_Create() флаг ILC_MASK не ипользовался - что в свою очередь означает *полную и безнадежную бесполезность* флага ILD_TRANSPARENT в ImageList_GetIcon() и ImageList_Draw()...


> Всё работает. Пока не пойму почему, но работает.
потому, что
> Сделал так. Конвертировал ico в bmp ...

 теперь осталось заменить на
ImageList1.GetBitmap(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Bitmap);


 
Dmitry   (2015-11-12 18:56) [5]

ImageList1.GetBitmap(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Bitmap); - белый фон, в лучшем случае. В худшем - изображение с каким-то хаотичным пятнистым фоном. Выкладывать скриншоты этого безобразия например на Радикал для дальнейшего анализа Уважаемыми Гуру считаю лишним. Уточню лишь, что конвертировал в .bmp не файлы .ico а файлы .png  (иконки я создавал именно из имеющихся готовых png тем же самым конвертером, так что png у меня имеются). Видимо тот конвертор какой-то "не такой как все" :-)
Искать по интернету и пробовать еще кучу конверторов - а надо ли ? Разве что в запасе у кого-нибудь есть надежный, проверенный годами...


 
©   (2015-11-12 20:14) [6]

ImageList1.ColorDepth = cd32Bit


 
©   (2015-11-12 20:16) [7]

BkColor = цвет фона ScrollBox


 
han_malign ©   (2015-11-13 12:12) [8]


> конвертор какой-то "не такой как все"

- на правах рекламы http://www.xnview.com/en/ - как ACDC в лучшие годы, но уже лучше и бесплатно(для некомерческого использования)...


> В худшем - изображение с каким-то хаотичным пятнистым фоном.

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


 
Dmitry   (2015-11-13 21:50) [9]

[6]: Нет в DesignTime такого свойства. Создавать динамически и грузить из ресурса - не вариант, иконки 10 раз еще изменятся.
[7]: А вот это помогло. И исходные ico и bmp 64х64 32 bit стали отображаться корректно при ImageList1.GetIcon().
Спасибо, наверное тема закрыта. Хотя... Я не настолько профи в Delphi (при этом пишу понемногу от случая к случаю вроде бы как 2002 года), чтобы разобраться почему ImageList1.DrawingStyle := dsTransparent "не срабатывает" при ImageList1.Draw() (с иконками творилось абсолютно то же самое). В фотошопе могу вручную подсунуть прозрачную основу на любое изо (и получить тем самым png), а вот что происходит в Delphi - не могу объяснить...


 
han_malign ©   (2015-11-17 11:28) [10]


>  а вот что происходит в Delphi - не могу объяснить...

- а вот Delphi тут совершенно ни при чём, TImageList - это оболочка компонента Windows https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb761389%28v=vs.85%29.aspx

И повторю в третий раз, но прямым текстом - сделай  ImageList1.Masked := true - и будет тебе счастье...



Страницы: 1 вся ветка

Текущий архив: 2017.10.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.005 c
2-1446919614
Dmitry
2015-11-07 21:06
2017.10.08
Иконки в TImage из Imagelist, теряется прозрачность


2-1447585332
dis12345
2015-11-15 14:02
2017.10.08
Получить имена пользователей компа


2-1446876256
SKIPtr
2015-11-07 09:04
2017.10.08
запись дублированого файла


2-1447840930
lewka
2015-11-18 13:02
2017.10.08
Работа с HTML


4-1284910325
Ingwar
2010-09-19 19:32
2017.10.08
Проблема прорисовки окна в Windows 7