Tworzenie uchwytu hIcon z ikony zapisanej jako strumień

0

Cześć,
szukam jakiegoś sposobu na stworzenie uchwytu hIcon z TMemoryStream, w którym zapisana jest ikona z wbudowanym plikiem PNG. Niestety standardowe komponenty Delphi XE6 nie wspierają tego rodzaju ikon. Jak do tej pory wpadłem na dwa rozwiązania:

  • zapis strumienia na dysk i odczyt za pomocą LoadImage -> HICON
  • wyciągnięcie z ikony pliku png, konwersja PNG -> BMP -> CreateIcon/CreateIconIndirect -> HICON.

Oba sposoby mają pewne wady, dlatego szukam jakiegoś innego rozwiązania.

0

to co dałeś to zwykła ikona a nie PNG
TIcon + LoadFromStream a potem masz TIcon.Handle

0

W TMemoryStream Seek 22 (z tego co widzę tam zaczyna się PNG Header) a później w TPngImage.LoadFromStream i dalej konwersja na ikonę.

1

Zgodnie z wytycznymi Microsoftu,

Only a 32-bit copy of the 256x256 pixel image should be included, and only the 256x256 pixel image should be compressed to keep the file size down.

Tylko rozmiar 256x256 powinien być w formacie PNG. Ta ikonka jest 16x16 więc powinna być nieskompresowana.
Po jej otwarciu pod IcoFX (otwiera się prawidłowo) i zapisaniu jej format zmienia się na standardowy.

Gdzie spotkałeś się z takim dziwadłem, i do czego ci to? ;-)

0

@Azarien: Obstawiam, że jest tak napisane ze względu na kompatybilność wsteczną. Wsparcie dla tego formatu pojawiło się w Viście i obsługuje on każdy rozmiar ikon. Funkcja LoadIcon radzi sobie z tym bez problemów.

Azarien napisał(a):

Gdzie spotkałeś się z takim dziwadłem, i do czego ci to? ;-)

Mam dużą ilość obrazków w formacie PNG i chciałem je w locie zamienić na ikony. Teoretycznie wystarczyło stworzyć strumień, potem zapisać w nim poprawny nagłówek ikony i na koniec dodać plik PNG. Niestety praktyka pokazała, że bez konwersji na BMP się nie obejdzie, bo nie ma funkcji WinAPI, która bez zapisu na dysk zwróci mi poprawny uchwyt do ikony.

1 użytkowników online, w tym zalogowanych: 0, gości: 1