¿Cómo cargaría una imagen PNG usando Win32 / GDI (sin GDI + si es posible)?

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

Puede usar el Componente de imágenes de Windows para cargar archivos PNG (en Windows XP SP2 y posterior). Consulte MSDN Magazine para obtener una introducción sobre cómo usar la API y mi publicación de blog para obtener un ejemplo de código que carga un archivo PNG desde un IStream y lo convierte en un HBITMAP.

No es necesario usar Windows Imaging Component, GDI + o la biblioteca PNG. Puedes usar la funcionalidad Icon.

  1. Agregue un nuevo ícono (ICO_PNG) a los recursos del proyecto de VC con ancho y alto personalizados (Editor de 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. Agregue Picture Control (IDC_PNG) a su cuadro de diálogo (tipo = dibujo del propietario).

  3. Código de procedimiento del cuadro de diálogo:

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; } } } 

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

Consulte la documentación de MSDN para más detalles:

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

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


Sinceramente, me disculpo por engañarlos a ustedes, interesados ​​en este tema. Déjame corregir mi error. No StretchDIBits para dibujo PNG. Es mejor que intente con el método WIC o considere la manera de integrar GDI + en sus proyectos.

No creas que GDI admite png, ¿has mirado libpng?