2010-12-31 15 views
18

Bir dosyadan PNG'yi Win32 GDI işlevlerini kullanarak bir HBITMAP'e yüklemek mümkün mü? Eğer değilse, dış kütüphaneleri (libpng gibi) kullanmadan en hafif çözüm ne olurdu?Win32/GDI kullanarak bir PNG görüntüsünü nasıl yüklerim (mümkünse GDI + yok)?

+1

Sadece küçük ve hızlı olarak mümkün olan her şeyi tutmaya çalışıyorum. Geçmişte GDI + 'nın hızı ile ilgili kötü deneyimler yaşadım. Bir HBITMAP'a ihtiyacım var ve GDI + doğrudan bir HBITMAP'e yüklenmiyor, bu yüzden başka bir kopyasını gerektiriyor. GDI + bir seçenek, en sevdiğim değil. – jnm2

cevap

22

PNG dosyalarını yüklemek için (Windows XP SP2 ve sonraki sürümlerinde) Windows Imaging Component kullanabilirsiniz. API'nin nasıl kullanılacağına ilişkin bir giriş ve bir IStream'den bir PNG yükleyen ve bir HBITMAP'e dönüştüren bir kod örneği için MSDN Magazine'a bakın.

+0

Merhaba Bradley, MSDN dergisinin bağlantısı kesilmiş gibi görünüyor, bağlantıyı güncelleyebilir ve belki de bazı örnek kodları makalenin cevabına ekler misiniz? Teşekkürler! – jrh

+0

@jrh Evet, Microsoft bu sayfayı çekti, ancak arşivlenmiş bir kopya var gibi görünüyor: http://web.archive.org/web/20080507014245/http://msdn.microsoft.com/en-us/magazine /cc500647.aspx –

+0

Microsoft'un [eski sorunları chm biçimine dönüştürdüğünü] unutmayın (http://download.microsoft.com/download/3/A/7/3A7FA450-1F33-41F7-9E6D-3AA95B5A6AEA/MSDNMagazineApril2008en-us. chm) - isterseniz, cevaba kod ekleyen bir düzenleme önerebilirim. – jrh

-1

Eğer libpng

+4

Evet, ancak yalnızca Windows'taki işlevleri kullanmak istiyorum. GDI + 'yı harici bir kütüphaneden daha çok kullanmayı tercih ederim. – jnm2

4

Sen StretchDIBits API ile bunu yapabilir baktı ama OS/sürücü kullanılabilirliği ile sınırlıdır, GDI png destekler düşünmeyin.

detaylar için MSDN belgelerine başvurun:

http://msdn.microsoft.com/en-us/library/dd145121(v=VS.85).aspx

http://msdn.microsoft.com/en-us/library/dd145107(VS.85).aspx


Umarım bu konuda ilgilenen adamlar yanıltıcı için özür dileriz. Hatamı düzeltmeme izin verin. PNG çizim için Hayır StretchDIBits. WIC yöntemini denemeli veya projelerinizde GDI + 'yı entegre etmeyi düşünmelisiniz.

+0

+1 ... kafamı duvara defalarca vurduktan sonra, sonunda bu cevabı gördüğüme sevindim! :) – Mehrdad

+0

+1 İyi biri. Şeffaflığı koruyor mu? – jnm2

+2

Ooch! Bu konuda biraz araştırma yaptım. Aslında GDI cihaz içeriğine PNG resmi çeken bir çalışma kodu yok gibi görünüyor. Birçok StretchDIBits PNG desteği tamamen işe yaramaz işaret ediyor. – 9dan

6

Windows Görüntüleme Bileşenini, GDI + veya PNG kitaplığını kullanmanıza gerek yoktur. Simge işlevselliğini kullanabilirsiniz.

  1. özel Genişlik ve Yükseklik (Kaynak Editör-> Resim-> Yeni Görüntü Türü) ile VC proje kaynaklarına yeni simgesine (ICO_PNG) ekleyin. Png resminizi buraya kopyalayın ve simgeyi saydamlaştırmak için Doldurma Aracı + saydam rengi kullanın.

  2. İletişim Kutunuza Picture Control (IDC_PNG) ekleme

  3. Diyalog prosedür kodu:

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

Benzer: [LoadImage ve StretchDIBits kullanarak bir PNG görüntüsünü nasıl çekerim?] (Http://stackoverflow.com/questions/4568057/how-would-i-draw-a-png-image-using-loadimage-and- StretchDIBits). Bu cevabın sadece png bir * kaynak * olduğunda işe yaradığını göz önünde bulundurduğumda, bir png dosyasını bağımsız bir dosyadan (ör., Myimage.png) doğrudan yükleyemedim. 'LoadImage' sadece dosyadan .ico simgelerini yüklemeyi destekliyor gibi görünüyor. – jrh

İlgili konular