Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранить иконку в PNG, средствами WinAPI 
V
    Опции темы
ksili
Дата 21.1.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Мне надо извлечь из чужого exe-шника иконку и сохранить ее в формате PNG. 

Как извлечь, я разобрался - функция ExtractIcon.
А вот как сохранить в другом формате? Вроде слышал, что надо его сначала где-то отрисовать в нужном формате,а потом сохранить? Какие функции тут нужно заюзать?

Ещё может понадобится изменять размер иконки.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
cutwater
Дата 21.1.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



Средствами WinAPI по идее никак. Кроме как с bmp не работает. Есть 2 варианта - использование сторонней библиотеки (например libpng) либо GDI+


--------------------
user posted image
PM MAIL   Вверх
ksili
Дата 21.1.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Если знаете, опишите как это сделать при помощи GDI+


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
GoldFinch
Дата 21.1.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



гугл уже не в моде?
http://www.google.ru/search?q=GDI%2B+PNG
PM MAIL ICQ   Вверх
ksili
Дата 21.1.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



я гуглил. Но че-то нашлись только примеры как загрузить PNG в ресурсы. А как ICO преобразовать в PNG не находил.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
bsa
Дата 21.1.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(ksili @ 21.1.2009,  13:54)
я гуглил. Но че-то нашлись только примеры как загрузить PNG в ресурсы. А как ICO преобразовать в PNG не находил.

А я нашел: http://www.vbdotnetheaven.com/UploadFile/t...ingGDIplus.aspx
Тут написано, как создать PNG файл. Думаю, у тебя не возникнет проблем заменой myBitmap на myIcon с соответствующими вызовами.
PM   Вверх
ksili
Дата 30.1.2009, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



как сохранить я наконец-то разобрался. В GDI+ Это оказыается оч просто
Код

HICON hicon = ExtractIcon(NULL, path.c_str(), 0);

    if(hicon)
    {
        GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR  gdiplusToken;
        CLSID  encoderClsid;

        Status st = GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
        
        if(st == Gdiplus::Ok)
        {
            //Bitmap tempIcon(48, 48, PixelFormat32bppARGB);
            //tempIcon.FromHICON(hicon);
            Bitmap myIcon(hicon);
            int result = GetEncoderClsid(L"image/png", &encoderClsid);

            if(result < 0)
            {
                MessageBox(L"The PNG encoder is not installed", L"Error", MB_OK);
            }
            else
            {
                                               myIcon.Save(iconame.c_str(), &encoderClsid);
                                    }
        GdiplusShutdown(gdiplusToken);
        DestroyIcon(hicon);
                     }
       }

Но теперь проблема в другом. Иконка это как правило - набор иконок разного размера. Оказывается ExtractIcon извлекает только одну иконку того размера, которая соответствует принятому в системе размеру по-умолчанию. В WinXp это 32*32. В Висте не знаю. Но дело в том, что мне нужно извлечь иконку 48*48 если такая есть. И желательно с максимальной разрядностью цвета. 

Как получить HICON этой иконки? Нашёл примеры с функциями LookupIconIdFromDirectoryEx, CreateIconFromResourceEx... но там такие нереальные дебри... 


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Andrey44
Дата 30.1.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Код

SHFILEINFO fileInfo;
    SHGetFileInfo(...);
    IImageList *imList; 
    SHGetImageList(...);



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
ksili
Дата 30.1.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Попробовал :
Цитата

SHFILEINFO fileInfo;
SHGetFileInfo(...);

но при флагах SHGFI_LARGEICON и SHGFI_LINKOVERLAY | SHGFI_OVERLAYINDEX все равно возвращается HICON иконки размером 32*32.

как заюзать  SHGetImageList вообще не понял. SHGetFileInfo может вернуть какой-то указатель на все иконки программы?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Andrey44
Дата 30.1.2009, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Код

HICON hIcon;
SHFILEINFO fileInfo;
    SHGetFileInfo(filePath, 0, &fileInfo, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX);
    IImageList *imList; 
    SHGetImageList(SHIL_EXTRALARGE, IID_IImageList, (void**)&imList);
    imList->GetIcon(fileInfo.iIcon, 0, &hIcon);

//SHIL_EXTRALARGE - These images are the shell standard extra-large icon size. This is typically 48x48, but it may be customized by the user to other sizes.
//SHIL_JUMBO - The image is 256x256 pixels.

Код рабочий 100%. Сам писал.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
ksili
Дата 30.1.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



а-а-а вот оно как...

Но я уже сделал наверно самым длинным путем - через
Код

HICON hicon = CreateIconFromResourceEx( (LPBYTE)pIcon, cbSize, TRUE, 0x00030000, 48, 48, flags );

Этот код вроде даже если нет иконки 48*48 смасштабирует к ней ближайшую.

Но все равно спасибо.

ЗЫ. А что такое IID_IImageList? Это же не константа?
Цитата

HRESULT SHGetImageList(          int iImageList,
    REFIID riid,
    void **ppv
);

Цитата

riid
[in] Image list interface identifier (IID_IImageList).


Что за интерфейс, как его создать?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
jonie
Дата 30.1.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



как раз константа. это UID определенный где-то в COM-е. Его создавать не надо, он уже есть, только надо подключить нужный файлик и все будет. Поищите в PlatformSDK.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.