2010-12-31 21 views
18

¿Es posible cargar un archivo PNG desde un archivo en un HBITMAP usando las funciones Win32 GDI? De lo contrario, ¿cuál sería la solución más ligera sin usar bibliotecas externas (como libpng)?¿Cómo cargaría una imagen PNG usando Win32/GDI (sin GDI + si es posible)?

+1

sólo estoy tratando de mantener todo lo más pequeño y rápido como sea posible. He tenido malas experiencias con la velocidad de GDI + en el pasado. Necesito un HBITMAP y GDI + no se carga directamente en un HBITMAP, por lo que requiere otra copia. GDI + es una opción, simplemente no es mi favorita. – jnm2

Respuesta

22

Puede utilizar el Windows Imaging Component para cargar archivos PNG (en Windows XP SP2 y posteriores). Ver MSDN Magazine para una introducción sobre cómo utilizar la API y my blog post para un ejemplo de código que carga un archivo PNG de un IStream y la convierte en un HBITMAP.

+0

Hola Bradley, Parece que el enlace de la revista MSDN no funciona, ¿podrías actualizar el enlace y quizás agregar un código de muestra en la respuesta del artículo? ¡Gracias! – jrh

+0

@jrh Sí, parece que Microsoft sacó esa página hacia abajo, pero una copia archivada está disponible: http://web.archive.org/web/20080507014245/http://msdn.microsoft.com/en-us/magazine /cc500647.aspx –

+0

Tenga en cuenta que Microsoft [convierte los números anteriores a formato CHM] (http://download.microsoft.com/download/3/A/7/3A7FA450-1F33-41F7-9E6D-3AA95B5A6AEA/MSDNMagazineApril2008en-us. chm) - si quieres, puedo sugerir una edición que agregue código a la respuesta. – jrh

-1

No piense GDI apoya png, ¿ha mirado libpng

+4

Sí, sin embargo, me gustaría usar solo funciones inherentes a Windows. Prefiero usar GDI + que una biblioteca externa. – jnm2

4

Puede hacerlo con StretchDIBits API, pero limitado por la disponibilidad/controlador del sistema operativo.

consultar la documentación de MSDN para obtener más información:

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

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


Me disculpo sinceramente por engañar a los chicos interesados ​​en este tema. Déjame corregir mi error. No StretchDIBits para dibujo PNG. Será mejor que pruebe el método WIC o considere la forma de integrar GDI + en sus proyectos.

+0

+1 ... después de golpear mi cabeza contra la pared varias veces, ¡me alegra ver finalmente esta respuesta! :) – Mehrdad

+0

+1 Buena una. ¿Conserva la transparencia? – jnm2

+2

¡Ooch! Hice algunas investigaciones sobre esto. Parece que no hay un código de trabajo realmente dibujando una imagen PNG en el contexto del dispositivo GDI. Muchos señalan que StretchDIBits PNG es totalmente inútil. – 9dan

6

No hay necesidad de utilizar Windows Imaging Component, GDI + o biblioteca PNG. Puedes usar la funcionalidad Icon.

  1. Añadir nuevo icono (ICO_PNG) a los recursos del proyecto de VC con la costumbre de anchura y altura (Editor-recursos> Imagen-> Nuevo Tipo de imagen). Copie su imagen png aquí y use la Herramienta de relleno + color transparente para hacer que el icono sea transparente.

  2. Agregar control de imagen (IDC_PNG) a su diálogo (Tipo = Propietario empate).

  3. diálogo código de procedimiento:

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

Relacionado: [¿Cómo dibujaría una imagen PNG usando LoadImage y StretchDIBits?] (Http://stackoverflow.com/questions/4568057/how-would-i-draw-a-png-image-using-loadimage-and- stretchdibits). Tenga en cuenta que esta respuesta parece funcionar solo si el png es un * recurso *, no pude cargar un png directamente desde un archivo independiente (por ejemplo, myimage.png). Parece que 'LoadImage' solo admite la carga de iconos .ico desde el archivo. – jrh

Cuestiones relacionadas