Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2013, 22:11   #1
fedorov2012
Пользователь
 
Регистрация: 05.01.2013
Сообщений: 61
Вопрос Как из TImageList'a, состоящий из PNG, вывести нужный в TImage

Есть TImageList (DelphiXE), состоящий из картинок PNG размером 32х32, как из такого ImageList вывести нужную картинку в TImage.
Если написать:
код Pascal/Delphi
Код:
ImageList.Draw(Image.Canvas, 0, 0, IndexIcon);
то Png выводится в TImage, но фон не прозрачный, а белый, как будто при выполнении этого кода Png превращается в Bitmap и уже Bitmap выводится.
fedorov2012 вне форума Ответить с цитированием
Старый 15.04.2013, 22:22   #2
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Лучше png картинки храни в ресурсах, так проще всего, а оттуда уже в имаги, какие хочешь, грузи напрямую. Тоже этим долго мучался.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 15.04.2013, 22:24   #3
fedorov2012
Пользователь
 
Регистрация: 05.01.2013
Сообщений: 61
Вопрос

Цитата:
Сообщение от alextrof94 Посмотреть сообщение
Лучше png картинки храни в ресурсах, так проще всего, а оттуда уже в имаги, какие хочешь, грузи напрямую. Тоже этим долго мучался.
К сожалению нет возможности загнать все в ресурсы (проект давний), что можете посоветовать при работе с ImageList'ом
fedorov2012 вне форума Ответить с цитированием
Старый 15.04.2013, 22:28   #4
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от fedorov2012 Посмотреть сообщение
К сожалению нет возможности загнать все в ресурсы (проект давний), что можете посоветовать при работе с ImageList'ом
где то читал, что можно использовать маски, т.е. хранишь в 24бит (bmp) изображения в imagelist, и по 8бит маски (ч/с/б тоже в bmp), а затем перемножая их получаешь что хочешь, собственно как раз так и происходит хранение альфа канала, в отдельных 8ми битах на пиксель. особенно вглубь не копал, потому как в тот момент как раз хотел изучить ресы, изучил - радуюсь)
alextrof94$gmail.com

Последний раз редактировалось alextrof94; 15.04.2013 в 22:44.
alextrof94 вне форума Ответить с цитированием
Старый 16.04.2013, 10:11   #5
jone
Форумчанин
 
Аватар для jone
 
Регистрация: 27.09.2008
Сообщений: 152
По умолчанию

если не ошибаюсь то в имг листе есть индексы картинок
jone вне форума Ответить с цитированием
Старый 16.04.2013, 10:18   #6
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от jone Посмотреть сообщение
если не ошибаюсь то в имг листе есть индексы картинок
ты не ошибаешься, только вопрос другой. это все равно что:
"
-Чуваки, у меня, когда еду, слышен стук из движка, в чем может быть проблема?
-Машина с помощью ключа заводится.
"
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 16.04.2013, 12:07   #7
fedorov2012
Пользователь
 
Регистрация: 05.01.2013
Сообщений: 61
Вопрос

Если в Image1 загрузить Png-картинку прямо с диска, а в Image2
загрузить через код:
Код:
ImageList.Draw(Image.Canvas, 0, 0, IndexIcon);
То выглядеть внешне они будут по-разному, во втором случае некачественно, появляется окантовка белая.

Также не помогло:
Код:
ms := TMemoryStream.Create;
lIcon := TIcon.Create;
try
  lIcon.SetSize(32, 32);
  lIcon.Transparent := True;
  ImageList.GetIcon(IconNum, lIcon);
  ImageList.SaveToStream(ms);
  ms.Seek(0, soFromBeginning);
  Image.Picture.Graphic.LoadFromStream(ms); //ВЫДАЕТСЯ ОШИБКА
finally
  lIcon.Free;
  ms.Free;
end
fedorov2012 вне форума Ответить с цитированием
Старый 16.04.2013, 14:04   #8
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

TransparentColor установите нужный - получите прозрачность
ReportCube вне форума Ответить с цитированием
Старый 16.04.2013, 14:06   #9
fedorov2012
Пользователь
 
Регистрация: 05.01.2013
Сообщений: 61
Вопрос

Цитата:
Сообщение от ReportCube Посмотреть сообщение
TransparentColor установите нужный - получите прозрачность
1. У какого компонента поставить?
2. Почему второй код не работает?
fedorov2012 вне форума Ответить с цитированием
Старый 16.04.2013, 17:15   #10
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Я же говорю, мучался с этим долго, в итоге нашел 2 выхода, хранить файлы в ресурсах, или же хранить 8-бит маску отдельно от 24-битного изображения, а затем при загрузке изображения перемножать 24бит на 8бит, получая тем самым 32 битное изображение с альфа-каналом. А transparentcolor применяется там где нет альфа-канала, а только фон надо убрать одноцветный (например зеленый #00FF00).
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отобразить png в определенном месте TImage rokotokobot Мультимедиа в Delphi 1 27.03.2011 18:49
Вывести Timage на весь экран igabenu Общие вопросы Delphi 1 29.01.2011 20:49
Загрузка PNG из dll в TImage bombers Помощь студентам 1 27.01.2011 01:59
Дан массив, состоящий из символов. Вывести на экран цифру, наиболее часто встречающуюся в этом массиве. Andros_me Помощь студентам 2 21.12.2010 08:50
Как вывести информацию при нажатии на ссылку в нужный div ??? 333_org_ua HTML и CSS 1 13.11.2010 13:51