Czy możliwe jest załadowanie pliku PNG z pliku do HBITMAP przy użyciu funkcji Win32 GDI? Jeśli nie, jakie byłoby najlżejsze rozwiązanie bez korzystania z zewnętrznych bibliotek (takich jak libpng)?Jak załadować obraz PNG przy użyciu Win32/GDI (bez GDI + jeśli to możliwe)?
Odpowiedz
Możesz użyć Windows Imaging Component do załadowania plików PNG (w systemie Windows XP SP2 i nowszych). Zobacz MSDN Magazine, aby uzyskać wprowadzenie dotyczące korzystania z interfejsu API i my blog post dla próbki kodu, która ładuje plik PNG z pliku IStream i konwertuje go na HBITMAP.
Witaj Bradley, Wygląda na to, że link do czasopisma MSDN jest wyłączony. Czy mógłbyś zaktualizować link i może dodać przykładowy kod do odpowiedzi z artykułu? Dzięki! – jrh
@jrh Tak, wygląda na to, że Microsoft wycofał tę stronę, ale dostępna jest zarchiwizowana kopia: http://web.archive.org/web/20080507014245/http://msdn.microsoft.com/en-us/magazine /cc500647.aspx –
Zauważ, że Microsoft [konwertowane do formatu starszych problemów chm] (http://download.microsoft.com/download/3/A/7/3A7FA450-1F33-41F7-9E6D-3AA95B5A6AEA/MSDNMagazineApril2008en-us. chm) - jeśli chcesz, mogę zasugerować edycję dodającą kod do odpowiedzi. – jrh
Można to zrobić z StretchDIBits
API, ale ograniczona dostępność OS/kierowcy.
znaleźć w dokumentacji MSDN szczegóły:
http://msdn.microsoft.com/en-us/library/dd145121(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/dd145107(VS.85).aspx
szczerze przeprosić za wprowadzenie w błąd was zainteresowanych tym problemem. Pozwól mi poprawić mój błąd. nr StretchDIBits
dla rysunku PNG. Lepiej spróbuj metody WIC lub rozważ sposób na integrację GDI + w swoich projektach.
+1 ... po wielokrotnym uderzaniu głową w ścianę, cieszę się, że wreszcie widzę tę odpowiedź! :) – Mehrdad
+1 Dobry. Czy zachowuje przejrzystość? – jnm2
Ooch! Zrobiłem trochę badań na ten temat. Wygląda na to, że nie ma działającego kodu, który faktycznie rysuje obraz PNG w kontekście urządzenia GDI. Wiele wskazuje na obsługę StretchDIBits PNG całkowicie bezużyteczną. – 9dan
Nie ma potrzeby korzystania z biblioteki Windows Imaging Component, biblioteki GDI + lub PNG. Możesz użyć funkcji Ikona.
Dodaj nową ikonę (ICO_PNG) do VC zasobów projektowych z niestandardową szerokość i wysokość (zasobów redaktora> obraz-> Nowy typ obrazu). Skopiuj tutaj swój obraz png i użyj narzędzia Wypełnienie + przezroczysty kolor, aby ikona była przezroczysta.
Dodaj ustawienie Picture Control (IDC_PNG) do okna dialogowego (Typ = Losowanie właściciela).
Dialog kod procedura:
switch (msg)
{
...
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
if (pDIS->CtlID == IDC_PNG)
{
HICON hIcon = (HICON)LoadImage(GetModuleHandle(0), MAKEINTRESOURCE(ICO_LOGO), IMAGE_ICON, 0, 0, LR_LOADTRANSPARENT);
DrawIconEx(pDIS->hDC, 0, 0, hIcon, 0, 0, 0, NULL, DI_NORMAL);
DestroyIcon(hIcon);
return TRUE;
}
}
}
Powiązane: [Jak mogę narysować obraz PNG za pomocą LoadImage i StretchDIBits?] (Http://stackoverflow.com/questions/4568057/how-would-i-draw--png-image-using-loadimage-and- stretdibits). Zauważ, że ta odpowiedź działa tylko wtedy, gdy png jest zasobem *, nie mogłem załadować png prosto z pliku autonomicznego (np. Myimage.png). Wygląda na to, że 'LoadImage' obsługuje tylko ładowanie ikon .ico z pliku. – jrh
- 1. Skompiluj/zapisz/wyeksportuj HTML jako obraz PNG przy użyciu Jquery
- 2. Jak skopiować obraz PNG do schowka przy użyciu Delphi
- 3. Jak załadować i wyświetlić obraz PNG w MATLAB?
- 4. Jeśli to możliwe, jak osadzić PostgreSQL?
- 5. Zastępowanie FILE_LOG_PATTERN (jeśli to możliwe na env)
- 6. Nakładka PNG na JPG przy użyciu Imagick
- 7. Jak załadować pliki CSS przy użyciu Javascript?
- 8. jak poznać ten obraz to jpg lub png iphone
- 9. jak zapisać płótno jako obraz png?
- 10. Jak załadować stronę internetową przy użyciu WPF
- 11. Zapisywanie duży obraz do PNG
- 12. Jak załadować CSS przy użyciu jquery
- 13. Załaduj lokalny obraz do przeglądarki przy użyciu JavaScript?
- 14. Odczytywanie pliku PNG przy użyciu Win32/C++
- 15. Załącznik Obraz wysłać pocztą przy użyciu Python
- 16. Jak mogę pobrać obraz przy użyciu Ruby?
- 17. Jak wyświetlić obraz RGB przy użyciu pylab
- 18. , jeśli jest to możliwe z warunkiem LUB
- 19. Konwersja png do jpeg przy użyciu poduszką w python
- 20. Jak załadować i zapisać plik przy użyciu butelka ramowa
- 21. Jak odczytać obraz PNG do NSImage
- 22. Jak ponownie załadować IMG co 5 sekund przy użyciu javascript?
- 23. Jak uzyskać obraz przy użyciu ajax jquery?
- 24. Zapisz widok wpf jako obraz, najlepiej .png
- 25. Zamień obraz przy użyciu jQuery
- 26. Czy możliwe jest BitBlt bezpośrednio z mapy bitowej GDI +?
- 27. Jak załadować obraz w Dart
- 28. Rekompilacja RTL - jeśli to możliwe, to w jaki sposób?
- 29. Czy wykreśla obraz na mapie przy użyciu matplotlib?
- 30. Jak ładować obraz zasobów png w Silverlight?
Po prostu staram się zachować wszystko jak małe i szybko jak to możliwe. Miałem złe doświadczenia z prędkością GDI + w przeszłości. Potrzebuję HBITMAP i GDI + nie ładuje się bezpośrednio do HBITMAP, więc wymaga kolejnej kopii. GDI + to opcja, po prostu nie moja ulubiona. – jnm2