Загрузка иконки из файла
От: Multix  
Дата: 17.02.11 06:42
Оценка:
Добрый день. Я гружу иконку из потока IStream в GdiPlus::Bitmap. Иконка размером 32x32. В ней есть прозрачные области. Сам рисунок находится в середине и имеет размер 24x24. Я хочу отобразить на экране иконку с размером 16x16. Если я делаю напрямую из файла через LoadImage() с указанием размеров 16x16, то он мне рисует картинку без прозрачной области, т.е сжимает 24x24 до 16x16. Если же гружу через Bitmap, то он сжимает полность с прозрачной областью, т.е с 32x32 до 16x16. Хочется получить результат как у LoadImage().
Re: Загрузка иконки из файла
От: Multix  
Дата: 17.02.11 07:41
Оценка:
Самое интересно что когда я передаю в LoadImage() размеры 32x32 а не 16 на 16, то я получаю результат тот же что и у Bitmap. А если 16x16 то все нормально
Re: Загрузка иконки из файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 17.02.11 13:02
Оценка:
Здравствуйте, Multix, Вы писали:

M>Добрый день. Я гружу иконку из потока IStream в GdiPlus::Bitmap. Иконка размером 32x32. В ней есть прозрачные области. Сам рисунок находится в середине и имеет размер 24x24. Я хочу отобразить на экране иконку с размером 16x16. Если я делаю напрямую из файла через LoadImage() с указанием размеров 16x16, то он мне рисует картинку без прозрачной области, т.е сжимает 24x24 до 16x16. Если же гружу через Bitmap, то он сжимает полность с прозрачной областью, т.е с 32x32 до 16x16. Хочется получить результат как у LoadImage().

А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным. А то я как-то бился с одной иконкой сконвертированной из PNG, пол-отрисосвки переписал, а потом открыл в редакторе иконок и стало понятно почему отрисовка пишет слово из трех букв... Потому как именно оно в иконке и было нарисовано (забыли фон нормально прозрачный сконвертировать)
Aml Pages Home
Re[2]: Загрузка иконки из файла
От: CEMb  
Дата: 17.02.11 16:10
Оценка:
Здравствуйте, Carc, Вы писали:


C>А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным.


Что-то как-то подозрительно часто все стали вспоминать IcoFx бесплатный
Re[3]: Загрузка иконки из файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 17.02.11 17:05
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Здравствуйте, Carc, Вы писали:



C>>А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным.


CEM>Что-то как-то подозрительно часто все стали вспоминать IcoFx бесплатный

А вполне нормальный кстати редактор для большинства простых задач. Для серьезного иконо-писания конечно нужно что-нить посолиднее.
Aml Pages Home
Re[4]: Загрузка иконки из файла
От: Multix  
Дата: 18.02.11 11:55
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, CEMb, Вы писали:


CEM>>Здравствуйте, Carc, Вы писали:



C>>>А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным.


CEM>>Что-то как-то подозрительно часто все стали вспоминать IcoFx бесплатный

C>А вполне нормальный кстати редактор для большинства простых задач. Для серьезного иконо-писания конечно нужно что-нить посолиднее.

Иконка что ни наесть адекватная. Дело видимо в том, что когда я гружу через LoadImage с указанием параметров 16x16( а сама иконка 32 на 32 ), то он берет картинку без невидимых границ( хотя сие было бы фантастикой, но все же... ) В моем случае — 24х24. А если указываю размеры 32 на 32 как и в иконке, то он мне всю иконку полность загружает 32х32. Далее ясное дело что при сжатии 32 на 32 до 16 на 16 я получаю маленькую картинку, которую не ожидаю, а когда сжимается 24 на 24 до 16 на 16 , то я не сильно обращаю внимаение на это. Вот я и подумал — может Bitmap`у принудительно как нибудь можно сказать размеры изображения.
Re[5]: Загрузка иконки из файла
От: Multix  
Дата: 18.02.11 12:40
Оценка:
Здравствуйте, Multix, Вы писали:

M>Здравствуйте, Carc, Вы писали:


C>>Здравствуйте, CEMb, Вы писали:


CEM>>>Здравствуйте, Carc, Вы писали:



C>>>>А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным.


CEM>>>Что-то как-то подозрительно часто все стали вспоминать IcoFx бесплатный

C>>А вполне нормальный кстати редактор для большинства простых задач. Для серьезного иконо-писания конечно нужно что-нить посолиднее.

M>Иконка что ни наесть адекватная. Дело видимо в том, что когда я гружу через LoadImage с указанием параметров 16x16( а сама иконка 32 на 32 ), то он берет картинку без невидимых границ( хотя сие было бы фантастикой, но все же... ) В моем случае — 24х24. А если указываю размеры 32 на 32 как и в иконке, то он мне всю иконку полность загружает 32х32. Далее ясное дело что при сжатии 32 на 32 до 16 на 16 я получаю маленькую картинку, которую не ожидаю, а когда сжимается 24 на 24 до 16 на 16 , то я не сильно обращаю внимаение на это. Вот я и подумал — может Bitmap`у принудительно как нибудь можно сказать размеры изображения.


IconFx показывает мне 4 иконки когда я открываю эту иконку в нем. 32х32 с 2 разными разрешениями цветов и 16х16 аналогично
Re[5]: Загрузка иконки из файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 18.02.11 12:48
Оценка:
Здравствуйте, Multix, Вы писали:

M>Здравствуйте, Carc, Вы писали:


C>>Здравствуйте, CEMb, Вы писали:


CEM>>>Здравствуйте, Carc, Вы писали:



C>>>>А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным.


CEM>>>Что-то как-то подозрительно часто все стали вспоминать IcoFx бесплатный

C>>А вполне нормальный кстати редактор для большинства простых задач. Для серьезного иконо-писания конечно нужно что-нить посолиднее.

M>Иконка что ни наесть адекватная. Дело видимо в том, что когда я гружу через LoadImage с указанием параметров 16x16( а сама иконка 32 на 32 ), то он берет картинку без невидимых границ( хотя сие было бы фантастикой, но все же... ) В моем случае — 24х24. А если указываю размеры 32 на 32 как и в иконке, то он мне всю иконку полность загружает 32х32. Далее ясное дело что при сжатии 32 на 32 до 16 на 16 я получаю маленькую картинку, которую не ожидаю, а когда сжимается 24 на 24 до 16 на 16 , то я не сильно обращаю внимаение на это. Вот я и подумал — может Bitmap`у принудительно как нибудь можно сказать размеры изображения.

Там кстати в Gdi+ есть незабвенный метод Bitmap::CreateFromHICON — не поможет ли случаем?
Aml Pages Home
Re[6]: Загрузка иконки из файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 18.02.11 12:56
Оценка:
Здравствуйте, Multix, Вы писали:

M>Здравствуйте, Multix, Вы писали:


M>>Здравствуйте, Carc, Вы писали:


C>>>Здравствуйте, CEMb, Вы писали:


CEM>>>>Здравствуйте, Carc, Вы писали:



C>>>>>А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным.


CEM>>>>Что-то как-то подозрительно часто все стали вспоминать IcoFx бесплатный

C>>>А вполне нормальный кстати редактор для большинства простых задач. Для серьезного иконо-писания конечно нужно что-нить посолиднее.

M>>Иконка что ни наесть адекватная. Дело видимо в том, что когда я гружу через LoadImage с указанием параметров 16x16( а сама иконка 32 на 32 ), то он берет картинку без невидимых границ( хотя сие было бы фантастикой, но все же... ) В моем случае — 24х24. А если указываю размеры 32 на 32 как и в иконке, то он мне всю иконку полность загружает 32х32. Далее ясное дело что при сжатии 32 на 32 до 16 на 16 я получаю маленькую картинку, которую не ожидаю, а когда сжимается 24 на 24 до 16 на 16 , то я не сильно обращаю внимаение на это. Вот я и подумал — может Bitmap`у принудительно как нибудь можно сказать размеры изображения.


M>IconFx показывает мне 4 иконки когда я открываю эту иконку в нем. 32х32 с 2 разными разрешениями цветов и 16х16 аналогично

Ну по идее это отдельные иконки, отдельно хранящиеся (в ico или ресурс). В понимании Винды HICON это всегда отдельное изображение на каждый размер. По моему если явно указывать размеры для LoadImage, то или загрузится иконка именно с такими размерами или NULL если такого нет. А вот если указывать 0 в качестве размера, то грузится то что есть без преобразований (правда, в MSDN ничего толком не говорится, что будет, если иконок несколько), а если указать LT_DEFAULTSIZE то используются размеры именно первой иконки... Блин, в MS-доке как всегда — куча информации что когда написано int, то это оказывается Integer (ну надо же йоптанах, кто бы мог подумать ), но про семантику как всегда половины нет...
Aml Pages Home
Re[6]: Загрузка иконки из файла
От: Multix  
Дата: 18.02.11 12:56
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, Multix, Вы писали:


M>>Здравствуйте, Carc, Вы писали:


C>>>Здравствуйте, CEMb, Вы писали:


CEM>>>>Здравствуйте, Carc, Вы писали:



C>>>>>А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным.


CEM>>>>Что-то как-то подозрительно часто все стали вспоминать IcoFx бесплатный

C>>>А вполне нормальный кстати редактор для большинства простых задач. Для серьезного иконо-писания конечно нужно что-нить посолиднее.

M>>Иконка что ни наесть адекватная. Дело видимо в том, что когда я гружу через LoadImage с указанием параметров 16x16( а сама иконка 32 на 32 ), то он берет картинку без невидимых границ( хотя сие было бы фантастикой, но все же... ) В моем случае — 24х24. А если указываю размеры 32 на 32 как и в иконке, то он мне всю иконку полность загружает 32х32. Далее ясное дело что при сжатии 32 на 32 до 16 на 16 я получаю маленькую картинку, которую не ожидаю, а когда сжимается 24 на 24 до 16 на 16 , то я не сильно обращаю внимаение на это. Вот я и подумал — может Bitmap`у принудительно как нибудь можно сказать размеры изображения.

C>Там кстати в Gdi+ есть незабвенный метод Bitmap::CreateFromHICON — не поможет ли случаем?

К сожалению у меня нет hIcon`а
Re[7]: Загрузка иконки из файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 18.02.11 12:58
Оценка:
Здравствуйте, Multix, Вы писали:

M>Здравствуйте, Carc, Вы писали:


C>>Здравствуйте, Multix, Вы писали:


M>>>Здравствуйте, Carc, Вы писали:


C>>>>Здравствуйте, CEMb, Вы писали:


CEM>>>>>Здравствуйте, Carc, Вы писали:



C>>>>>>А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным.


CEM>>>>>Что-то как-то подозрительно часто все стали вспоминать IcoFx бесплатный

C>>>>А вполне нормальный кстати редактор для большинства простых задач. Для серьезного иконо-писания конечно нужно что-нить посолиднее.

M>>>Иконка что ни наесть адекватная. Дело видимо в том, что когда я гружу через LoadImage с указанием параметров 16x16( а сама иконка 32 на 32 ), то он берет картинку без невидимых границ( хотя сие было бы фантастикой, но все же... ) В моем случае — 24х24. А если указываю размеры 32 на 32 как и в иконке, то он мне всю иконку полность загружает 32х32. Далее ясное дело что при сжатии 32 на 32 до 16 на 16 я получаю маленькую картинку, которую не ожидаю, а когда сжимается 24 на 24 до 16 на 16 , то я не сильно обращаю внимаение на это. Вот я и подумал — может Bitmap`у принудительно как нибудь можно сказать размеры изображения.

C>>Там кстати в Gdi+ есть незабвенный метод Bitmap::CreateFromHICON — не поможет ли случаем?

M>К сожалению у меня нет hIcon`а

Хм, а вообще откуда берутся данные для иконки? Может каким другим просто путем пойти?
Aml Pages Home
Re[8]: Загрузка иконки из файла
От: Multix  
Дата: 18.02.11 13:01
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, Multix, Вы писали:


M>>Здравствуйте, Carc, Вы писали:


C>>>Здравствуйте, Multix, Вы писали:


M>>>>Здравствуйте, Carc, Вы писали:


C>>>>>Здравствуйте, CEMb, Вы писали:


CEM>>>>>>Здравствуйте, Carc, Вы писали:



C>>>>>>>А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным.


CEM>>>>>>Что-то как-то подозрительно часто все стали вспоминать IcoFx бесплатный

C>>>>>А вполне нормальный кстати редактор для большинства простых задач. Для серьезного иконо-писания конечно нужно что-нить посолиднее.

M>>>>Иконка что ни наесть адекватная. Дело видимо в том, что когда я гружу через LoadImage с указанием параметров 16x16( а сама иконка 32 на 32 ), то он берет картинку без невидимых границ( хотя сие было бы фантастикой, но все же... ) В моем случае — 24х24. А если указываю размеры 32 на 32 как и в иконке, то он мне всю иконку полность загружает 32х32. Далее ясное дело что при сжатии 32 на 32 до 16 на 16 я получаю маленькую картинку, которую не ожидаю, а когда сжимается 24 на 24 до 16 на 16 , то я не сильно обращаю внимаение на это. Вот я и подумал — может Bitmap`у принудительно как нибудь можно сказать размеры изображения.

C>>>Там кстати в Gdi+ есть незабвенный метод Bitmap::CreateFromHICON — не поможет ли случаем?

M>>К сожалению у меня нет hIcon`а

C>Хм, а вообще откуда берутся данные для иконки? Может каким другим просто путем пойти?

Имееться только IStream либо двоичные данные. Кстати. Если винда решает по размерам, какую иконку грузить из ico файла, то наверное я могу сказать и GDI+`у какую загрузить, либо я заблуждаюсь. Что бы не было непониманий — у меня ico файл.
Re[9]: Загрузка иконки из файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 18.02.11 13:17
Оценка:
Здравствуйте, Multix, Вы писали:

M>Здравствуйте, Carc, Вы писали:


C>>Здравствуйте, Multix, Вы писали:


M>>>Здравствуйте, Carc, Вы писали:


C>>>>Здравствуйте, Multix, Вы писали:


M>>>>>Здравствуйте, Carc, Вы писали:


C>>>>>>Здравствуйте, CEMb, Вы писали:


CEM>>>>>>>Здравствуйте, Carc, Вы писали:



C>>>>>>>>А иконка не "битая" случаем? Можно посмотреть каким-нить IcoFx бесплатным.


CEM>>>>>>>Что-то как-то подозрительно часто все стали вспоминать IcoFx бесплатный

C>>>>>>А вполне нормальный кстати редактор для большинства простых задач. Для серьезного иконо-писания конечно нужно что-нить посолиднее.

M>>>>>Иконка что ни наесть адекватная. Дело видимо в том, что когда я гружу через LoadImage с указанием параметров 16x16( а сама иконка 32 на 32 ), то он берет картинку без невидимых границ( хотя сие было бы фантастикой, но все же... ) В моем случае — 24х24. А если указываю размеры 32 на 32 как и в иконке, то он мне всю иконку полность загружает 32х32. Далее ясное дело что при сжатии 32 на 32 до 16 на 16 я получаю маленькую картинку, которую не ожидаю, а когда сжимается 24 на 24 до 16 на 16 , то я не сильно обращаю внимаение на это. Вот я и подумал — может Bitmap`у принудительно как нибудь можно сказать размеры изображения.

C>>>>Там кстати в Gdi+ есть незабвенный метод Bitmap::CreateFromHICON — не поможет ли случаем?

M>>>К сожалению у меня нет hIcon`а

C>>Хм, а вообще откуда берутся данные для иконки? Может каким другим просто путем пойти?

M>Имееться только IStream либо двоичные данные. Кстати. Если винда решает по размерам, какую иконку грузить из ico файла, то наверное я могу сказать и GDI+`у какую загрузить, либо я заблуждаюсь. Что бы не было непониманий — у меня ico файл.

Для ICO-файлов есть несколько методов:
1) ExtactIconEx — если подсунуть путь к ICO-файлу, то кушает за милую душу.
2) SHGetFileInfo + SHGFI_ICON — тоже кушает за милую душу, если ей выдать путь к ico-файлу (правда будет исключительно первая иконка, если файл многостраничный, т.е. в нем несколько изображений)
3) LoadImage + LR_LOADFROMFILE — тоже распрекрасно работает
4) Можно ручками считать и распарсить ICO-формат и ручками создать иконки через CreateIconIndirect (достаточно рутинный способ, но как раз все эти ico-редакторы так и делают). Сам не пробовал именно со чтением файла, т.к. нужды в этом не было, но как раз сейчас решаю параллельную задачу (есть HICON, его надо разложить "на множители" и адекватно записать в ico-файл — решаемая задача, в 99 из 100 уже работает. Танцы с бубном начинаются только с Vista-иконкам с PNG, ну и определенная морока с альфа-каналом).
Aml Pages Home
Re[10]: Загрузка иконки из файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 18.02.11 13:18
Оценка:
Сорри, забыл смысл то сказать Все вышеуказанные методы дадут нам на выходе HICON...
Aml Pages Home
Re[11]: Загрузка иконки из файла
От: Multix  
Дата: 18.02.11 13:33
Оценка:
Здравствуйте, Carc, Вы писали:

C>Сорри, забыл смысл то сказать Все вышеуказанные методы дадут нам на выходе HICON...


Я пониамаю, но файла у меня нет. Я знаю чьи у меня двоичные данные, но физически на диске файла не имею. Остается вариант распарсить, что очень не хочется делать.
Re[12]: Загрузка иконки из файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 18.02.11 13:51
Оценка:
Здравствуйте, Multix, Вы писали:

M>Здравствуйте, Carc, Вы писали:


C>>Сорри, забыл смысл то сказать Все вышеуказанные методы дадут нам на выходе HICON...


M>Я пониамаю, но файла у меня нет. Я знаю чьи у меня двоичные данные, но физически на диске файла не имею. Остается вариант распарсить, что очень не хочется делать.

Распарсить там не сложно. Достаточно простой формат
1) Сначала идет 3 раза по 2 байта (2 байта пофиг, 2 байта — это число иконок в ico-файле, и еще 2 — это ID для формата иконок — в нашем случае 1)
2) Потом идет несколько структур ICONENTRY (сколько иконок в файле), там высота, ширина и все такое. И сдвиг в файле откуда начинаются данные изображения
3) Потом идут на каждую иконку в файле BITMAPINFOHEADER
4) Потом цветовая палитра (для полноцветных там ничего нет)
5) Потом идут биты битмапов

Просветленные умы гуглят следующими способами
1) IconsPro + ReadIcoFromFile — это старинный пример от MS, в ней есть незабвенная функция ReadIcoFromFile. Код мутноватый и заточенный под пример, но разобраться можно
2) Icons in Win32 — старинная статья от MS про формат ICO, к ней кстати и вышеуказанный IconsPro примером и является
3) CXImage+Codeproject.com+CXImageIco — это библиотека для работы с изображением с открытым кодом, в ней есть и код чтения из ICO...

Ну а дальше вперед. Распарсить формат ico-файла самое рутинное в этой задаче будет. А дальше создаем 2 bitmap (изображение + маска). И подсовываем их CreateIconIndirect. На выходе получаем HICON и будет нам счастие...
Aml Pages Home
Re[13]: Загрузка иконки из файла
От: Aniskin  
Дата: 18.02.11 18:09
Оценка:
Здравствуйте, Carc, Вы писали:

C>Ну а дальше вперед. Распарсить формат ico-файла самое рутинное в этой задаче будет. А дальше создаем 2 bitmap (изображение + маска). И подсовываем их CreateIconIndirect. На выходе получаем HICON и будет нам счастие...


Еще можно (нужно?) учесть, что данные о цвете могут быть в виде стандартного png.
Re[14]: Загрузка иконки из файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 21.02.11 12:44
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Здравствуйте, Carc, Вы писали:


C>>Ну а дальше вперед. Распарсить формат ico-файла самое рутинное в этой задаче будет. А дальше создаем 2 bitmap (изображение + маска). И подсовываем их CreateIconIndirect. На выходе получаем HICON и будет нам счастие...


A>Еще можно (нужно?) учесть, что данные о цвете могут быть в виде стандартного png.

Могут. Но в CXImage есть код работающий с png-иконками, там можно посмотреть что к чему...
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.