2010-12-31 15 views
18

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)?

+1

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

Odpowiedz

22

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.

+0

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

+0

@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 –

+0

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

-1

Nie myśl GDI obsługuje PNG, pan spojrzał na libpng

+4

Tak, jednak chciałbym używać tylko funkcji właściwych dla systemu Windows. Wolałbym używać GDI + niż biblioteki zewnętrznej. – jnm2

4

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.

+0

+1 ... po wielokrotnym uderzaniu głową w ścianę, cieszę się, że wreszcie widzę tę odpowiedź! :) – Mehrdad

+0

+1 Dobry. Czy zachowuje przejrzystość? – jnm2

+2

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

6

Nie ma potrzeby korzystania z biblioteki Windows Imaging Component, biblioteki GDI + lub PNG. Możesz użyć funkcji Ikona.

  1. 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.

  2. Dodaj ustawienie Picture Control (IDC_PNG) do okna dialogowego (Typ = Losowanie właściciela).

  3. 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; 
     } 
    } 
} 
+0

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

Powiązane problemy