С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87

ImageList с поддержкой прозрачных png

05.06.2013, 00:24. Показов 3880. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, уважаемые коллеги!
Необходима помощь!!! Использую BCB 6. Пытаюсь использовать стандартный имейдж лист , а он не поддерживает прозрачность + не сохраняет png.
Необходим самый простой выход из данной ситуации. Пока думаю какой вариант выбрать:
1) Использовать GDI+ (хороший вариант, но не хочется изобретать велосипед);
2) Использовать метод описанный на данном форуме " DLL, как контейнер изображений" (почему-то у меня не получилось его реализовать на BCB 6);
3) Использовать PngComponents (у меня есть только dpk под дельфи. Возможно кто-нибудь поделится для BCB ? Это был бы для меня самый приемлемый вариант)
4) Возможно есть еще какое-то решение?


Спасибо, с уважением

Добавлено через 1 час 4 минуты
Например, если использовать GDI+ ,то png с альфа-каналом выводится просто на ура
C++
1
2
Gdiplus::Image image(L"symbol.png");
graphics->DrawImage(&image, 60, 10);
Остается решить вопрос , где их хранить ?
просто в папке не очень хорошее решение.
1) в ехе файле (как это сделать?)
2) в длл (как это сделать с помощью bcb 6?)
3) какой-то еще вариант
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.06.2013, 00:24
Ответы с готовыми решениями:

Куб состоит из n[SUP]3[/SUP] прозрачных и не прозрачных элементарных кубиков. Имеется ли хотя бы один просвет по каждому из трех измерений? Если это т
Задание: Куб состоит из n3 прозрачных и не прозрачных элементарных кубиков. Имеется ли хотя бы один просвет по каждому из трех измерений?...

Подскажите бесплатный хостинг с поддержкой MySQL баз и с поддержкой внешних подключений к базе данных
Нужен бесплатный хостинг, у которого нет такого прикола как указание IP адреса явно разрешённого для подключения к MySQL базе данных....

Вращение TImage c PNG. Нужна переделка решения для BMP под PNG
Здравствуйте. Очень нужна помощь с вращением. Есть решение данной проблемы для формата bmp :...

12
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.06.2013, 05:06
ksv_uk,
Цитата Сообщение от ksv_uk Посмотреть сообщение
1) в ехе файле (как это сделать?)
2) в длл (как это сделать с помощью bcb 6?)
3) Использовать PngComponents (у меня есть только dpk под дельфи. Возможно кто-нибудь поделится для BCB ? Это был бы для меня самый приемлемый вариант)
1. Запихнуть картинку в ресурс, не факт, что bcb 6 сохранит прозрасность
2. DLL, как контейнер изображений. [FAQ]
3. Установка компонентов для Delphi на С++ Builder
1
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
05.06.2013, 10:04  [ТС]
Смотрю в сторону создания DLL. DLL, как контейнер изображений. [FAQ]-не работает в ВСВ6. Как с помощью BCB6 сделать dll с картинками?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.06.2013, 12:18
Понятно и конкретно опишите, что вы делали, процитируйте код, который вы для этого использовали, скажите, какие результаты вы ожидали получить и какие фактически получили, а также процитируйте возможные ошибки и предупреждения, которые вы получили, а также укажите - процитируйте участки кода (не номер строки, которая, как правило, не совпадает с номером строки в цитате кода на форуме и кодом в билдере), к которым относятся эти предупреждения и ошибки.

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

Да, это требует от вас определенных усилий, но - разбираться в ваших проблемах - тоже определенный труд, попытайтесь сделать его максимально легким и приятным .
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2013, 12:22
ImageList сугубо для иконок, и у него доступ изображению тормознутый.
Картинки же можно помещать в ресурсы или dll.

Что касается версии BCB6, то кажется у него вообще проблемы с png , так что ...
Что касается прозрачности, то ее можно достигнуть и при использовании bmp -формата
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
05.06.2013, 12:29
Сколько приблизительно картинок png должно быть подключено и какой их общий "тоннаж"? Если в пределах разумного, то я предлагаю не таскать с приложением файл dll, а расположить все картинки в ресурсах. Вкрутить их в имэйдж затем труда не составит__
C++
1
2
3
4
5
  TPNGObject *png = new TPNGObject();
  TResourceStream *mrs = new TResourceStream(0,"FOTO2","BINARY");
  png->LoadFromStream(mrs);
  Image2->Picture->Bitmap->Assign(png);
  delete mrs; delete png;
Если у имэйджа прозрачность true, то и прозрачность png сохранится.
1
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
05.06.2013, 13:40  [ТС]
Самих файлов png немного (порядка 25, но все они имеют небольшие размеры).
По поводу TPNGObject - это опять отдельный компонент. (отображение png уже решил с помощью GDI+)
Проблема осталась с хранением. Может глупый вопрос, но я не знаю как засунуть png в файл ресурсов и использовать потом в среде BCB6. Если кто знает ткните носом, что почитать?

С уважением, Сергей

Спасибо
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2013, 13:42

Не по теме:

Цитата Сообщение от ksv_uk Посмотреть сообщение
(отображение png уже решил с помощью GDI+)
Не подскажешь как ?



Добавлено через 1 минуту
Цитата Сообщение от ksv_uk Посмотреть сообщение
что почитать?
Архангельского 7издание - там есть в общем как пихать в ресурсы.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
05.06.2013, 13:50
Цитата Сообщение от Avazart Посмотреть сообщение
Не подскажешь как ?
- присоединяюсь.
А с ресурсами - ничего сложного. Самое простое - написать в текстовом редакторе в чистом файле что-то типа:
C++
1
2
FOTO1 BINARY "05.png"
FOTO2 BINARY "dok17.png"
сохранить файл как "нечто.rc" рядом с проектом и подключить к проекту (Project - AddToProject)
2
05.06.2013, 13:52

Не по теме:

Цитата Сообщение от nick42 Посмотреть сообщение
А с ресурсами - ничего сложного. Самое простое - написать в текстовом редакторе в чистом файле что-то типа:
В новых версиях можно добавить файлы через менюшку

0
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
05.06.2013, 14:03  [ТС]
По поводу вывода png с помощью GDI+ тоже ничего сложгно (гораздо сложнее было ее прицепить )
Я делал так

C++
1
graphics = new  Gdiplus::Graphics(Form1->Image1->Canvas->Handle);
Наш конструктор которому передаем хендл , где хотим рисовать.

Далее можно выводить нашу пнгшку

C++
1
2
       Gdiplus::Image image(L"symbol.png");
       graphics->DrawImage(&image, 60, 10);
Все выводится в первозданном виде...

С уважением, Сергей
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2013, 14:53
Изображение ведь не сохраняется на канве, и стирается при перерисовке ( например после перекрытии другим окном) ?

Добавлено через 53 секунды
Цитата Сообщение от ksv_uk Посмотреть сообщение
гораздо сложнее было ее прицепить )
https://www.cyberforum.ru/blog... og477.html
0
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
07.06.2013, 17:21  [ТС]
Добрый вечер!
Поборол вывод Png из ресурсов. Спасибо большое nick42.
C++
1
2
3
4
TPNGObject *png = new TPNGObject();
       TResourceStream *mrs = new TResourceStream(0,"Aqua","BINARY");
       png->LoadFromStream(mrs);
       Image1->Canvas->Draw(100,80,png);
Теперь возник вопрос, а как повернуть ее(png)?

И еще остается открытым вопрос как из ресурсов вытягивать png средствами GDI+. Все-таки там арсенал функций побогаче. Поиски в нете по данной теме пока ни к чему ни привели.
Но ведь как-то можно - это делать
C++
1
 pImage1 = Image::FromStream(pIStream1);
Вот так легко сделать поворот в GDI+
C++
1
2
 graphics.DrawImage(&image, 10, 10, image.GetWidth(), image.GetHeight());
   image.RotateFlip(Rotate90FlipY);
Добавлено через 14 часов 47 минут
Добрый день, уважаемые коллеги!
Вот что получилось сделать. Попытался связать TResourceStream с IStream, чтобы дальше работать с GDI+ без всяких "велосипедов". Код не мой , но рабочий (немного исправленный), ошибок нет, но картинка почему-то не выводится. Я уж не знаю где собака порылась.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
graphics = new  Gdiplus::Graphics(Form1->Image1->Canvas->Handle);
graphics->SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);
//наша пнг из ресурсов
TResourceStream *mrs = new TResourceStream(0,"Aqua","BINARY");
Gdiplus::Image* pImage; 
//создаем буфер
 char *buf = new char[mrs->Size];
 
 mrs->Seek(0,soFromBeginning);
 
//заполняем буфер
 mrs->Read (buf, mrs->Size);
 unsigned long size = mrs->Size;
 
 IStream *pIStream=NULL;
 
 HRESULT hr;
 
 Gdiplus::Status stat;
 
 //Ñîçäàåì IStream 
      CreateStreamOnHGlobal(NULL, TRUE, &pIStream);
 
      //Çàäàåì êîëè÷åñòâî áàéòîâ êàðòèíêè
      ULARGE_INTEGER lu;
      lu.LowPart=size;
      lu.HighPart=0;
      hr = pIStream->SetSize(lu);
      if(FAILED(hr)){};// êîíòðîëü îøèáîê
 
      //Ïîçèöèîíèðóåì ïîòîê â íà÷àëî
      LARGE_INTEGER li;
      ZeroMemory(&li, sizeof(li));
      hr = pIStream->Seek(li, STREAM_SEEK_SET, 0);
      if(FAILED(hr)){};// êîíòðîëü îøèáîê
 
      //Ïåðåïèñûâàåì èç áóôåðà buf â ïîòîê pIStream
      hr = pIStream->Write(buf, size, 0);
      if(FAILED(hr)){};// êîíòðîëü îøèáîê
 
      //Ïîçèöèîíèðóåì ïîòîê â íà÷àëî
      hr = pIStream->Seek(li, STREAM_SEEK_SET, 0);
      if(FAILED(hr)){};// êîíòðîëü îøèáîê
 
 
 
 
 pImage = new Gdiplus::Image(pIStream);
 
//stat ìîæíî èñïîëüçîâàòü äëÿ êîíòðîëÿ îøèáîê
 stat = pImage->GetLastStatus();
 
 //Gdiplus::Graphics graphics(Form1->Image1->Canvas->Handle);
 graphics->DrawImage(pImage, 20, 20);
Добавлено через 2 часа 11 минут
Добавил проверку на альфа-канал
C++
1
2
3
4
UINT flags = pImage->GetFlags();
 if(flags & Gdiplus::ImageFlagsHasAlpha)  {
  ShowMessage("Есть альфа канал");
 }
проверка показала, что действительно у нашей пнг есть альфа канал. Чего ж она тогда не выводится?????

Добавлено через 17 минут
ВСЕ, удалось вывести картинку. Мне удалось связать TResourceStream с IStream.
Решил проблему методом втыка. Если кто-нибудь объяснит мне в чем была проблемв буду очень благодарен.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
graphics = new  Gdiplus::Graphics(Form1->Image1->Canvas->Handle);
graphics->SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);
 
TResourceStream *mrs = new TResourceStream(0,"Aqua","BINARY");
 
//ñîçäàåì áóôåð
 char *buf = new char[mrs->Size];
 
 mrs->Seek(0,soFromBeginning);
 
//çàïîëíÿåì áóôåð
 mrs->Read (buf, mrs->Size);
 unsigned long size = mrs->Size;
 
 IStream *pIStream=NULL;
 
 HRESULT hr;
 
 Gdiplus::Status stat;
 
 //Ñîçäàåì IStream 
      CreateStreamOnHGlobal(NULL, TRUE, &pIStream);
 
      //Çàäàåì êîëè÷åñòâî áàéòîâ êàðòèíêè
      ULARGE_INTEGER lu;
      lu.LowPart=size;
      lu.HighPart=0;
      hr = pIStream->SetSize(lu);
      if(FAILED(hr)){};// êîíòðîëü îøèáîê
 
      //Ïîçèöèîíèðóåì ïîòîê â íà÷àëî
      LARGE_INTEGER li;
      ZeroMemory(&li, sizeof(li));
      hr = pIStream->Seek(li, STREAM_SEEK_SET, 0);
      if(FAILED(hr)){};// êîíòðîëü îøèáîê
 
      //Ïåðåïèñûâàåì èç áóôåðà buf â ïîòîê pIStream
      hr = pIStream->Write(buf, size, 0);
      if(FAILED(hr)){};// êîíòðîëü îøèáîê
 
      //Ïîçèöèîíèðóåì ïîòîê â íà÷àëî
      hr = pIStream->Seek(li, STREAM_SEEK_SET, 0);
      if(FAILED(hr)){};// êîíòðîëü îøèáîê
 
  Gdiplus::Image pImage(pIStream);
 
  graphics->DrawImage(&pImage, 20, 20);
 
  delete mrs,pImage,pIStream;
Добавлено через 5 минут
Теперь повороты прозрачных png можно делать , написав всего одну строчку

C++
1
2
pImage.RotateFlip(Gdiplus::Rotate90FlipY);// повернули на 90 градусов
graphics->DrawImage(&pImage, 20, 20);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2013, 17:21
Помогаю со студенческими работами здесь

Объединение нескольких png файлов в один png-файл
В общем надо написать програмулину, которая объединяет несколько png файлов (ширина и высота одинаковы у изображений) в один png-файл. ...

Какое расширение выбрать JPG/GIF/PNG-8/PNG-24
Применение их

Close.png не была загружена, потому что её MIME-тип («image/png») не «text/css»
Вот такую получаю ошибку Таблица стилей http://localhost:8080/temp/images/close.png не была загружена, потому что её MIME-тип...

PNG анимация из одного и нескольких PNG-файлов
Доброго времени суток! До начала изучения языка программирования, я увлекался созданием игр через специальные программы, в них была...

Перекрытие прозрачных шейпов
Добрый день, как можно сделать полупрозрачный шейп чтобы не было видно контура нижнего шейпа? Для примера скрин, на нём есть фон, поверх...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru