![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Иконки в TImage из Imagelist, теряется прозрачность
Dmitry © (2015-11-07 21:06:00)Доброго времени суток, Уважаемые.
Необходимо динамически создавать 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);
получаю картинку на белом фоне.
Что не так делаю ?
han_malign (2015-11-17 11:28:00) [1]
> а вот что происходит в Delphi - не могу объяснить...
- а вот Delphi тут совершенно ни при чём, TImageList - это оболочка компонента Windows https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb761389%28v=vs.85%29.aspx
И повторю в третий раз, но прямым текстом - сделай ImageList1.Masked := true- и будет тебе счастье...
Dmitry (2015-11-13 21:50:00) [2][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-13 12:12:00) [3]
> конвертор какой-то "не такой как все"
- на правах рекламы http://www.xnview.com/en/- как ACDC в лучшие годы, но уже лучше и бесплатно(для некомерческого использования)...
> В худшем - изображение с каким-то хаотичным пятнистым фоном.
- походу ImageList умнеет с каждым днем, и таки умудрился альфа-канал подгрузить и потом правильно конвертнуть в ico...
Но это уже гадание на кофейной гуще...
p (2015-11-12 20:16:00) [4]BkColor = цвет фона ScrollBox
p (2015-11-12 20:14:00) [5]ImageList1.ColorDepth = cd32Bit
Dmitry (2015-11-12 18:56:00) [6]ImageList1.GetBitmap(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Bitmap); - белый фон, в лучшем случае. В худшем - изображение с каким-то хаотичным пятнистым фоном. Выкладывать скриншоты этого безобразия например на Радикал для дальнейшего анализа Уважаемыми Гуру считаю лишним. Уточню лишь, что конвертировал в .bmp не файлы .ico а файлы .png (иконки я создавал именно из имеющихся готовых png тем же самым конвертером, так что png у меня имеются). Видимо тот конвертор какой-то "не такой как все" :-)
Искать по интернету и пробовать еще кучу конверторов - а надо ли ? Разве что в запасе у кого-нибудь есть надежный, проверенный годами...
han_malign (2015-11-12 17:09:00) [7]
> > 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-11 20:14:00) [8]Нет у меня в 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-10 12:32:00) [9]
> 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-07 21:13:00) [10]Исправление:
ImageList1.GetIcon(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Icon);
ImageList1.GetBitmap(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Bitmap);