¿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)?
Respuesta
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.
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
@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 –
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
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.
+1 ... después de golpear mi cabeza contra la pared varias veces, ¡me alegra ver finalmente esta respuesta! :) – Mehrdad
+1 Buena una. ¿Conserva la transparencia? – jnm2
¡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
No hay necesidad de utilizar Windows Imaging Component, GDI + o biblioteca PNG. Puedes usar la funcionalidad Icon.
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.
Agregar control de imagen (IDC_PNG) a su diálogo (Tipo = Propietario empate).
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;
}
}
}
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
- 1. ¿Cómo centro una imagen girada usando GDI +?
- 2. cómo comprimir una imagen PNG usando Java
- 3. PNG - ¿Es posible reducir la paleta usando Java 2D?
- 4. ¿Crear imagen con fondo transparente usando GDI +?
- 5. Cómo funciona GDI/GDI + sin OpenGL o DirectX
- 6. Posible crear una sombra css sobre fondo transparente Imagen PNG?
- 7. Usando UIImagePickerController para obtener una imagen, ¿cómo saber si guardar PNG o JPEG?
- 8. Cómo copiaría una imagen PNG al portapapeles usando Delphi
- 9. Compilar/Guardar/Exportar HTML como una imagen PNG usando Jquery
- 10. ¿Detecta si un archivo de imagen PNG es una imagen transparente?
- 11. Cómo convertir una imagen JPG a PNG
- 12. Convertir ppm a png
- 13. ¿Cómo comprobar si un archivo cargado es una imagen sin tipo de mime?
- 14. ¿Tiene GDI + codificadores de imagen estándar CLSID?
- 15. if ($ ext == ('zip' || 'png')) {echo "¿Es posible?" }
- 16. Crear una imagen PNG dinámica
- 17. Cómo mostrar una imagen animada de una imagen PNG usando javascript? [como gmail]
- 18. GDI +/C#: ¿Cómo guardar una imagen como EMF?
- 19. cómo saber esta imagen es jpg o png iphone
- 20. cómo determinar si una imagen es explícita
- 21. ¿Cómo combinar PNG transparente con imagen usando PHP?
- 22. cómo combinar una imagen PNG transparente con otra imagen usando PIL
- 23. ¿Cómo obtengo un ícono de una imagen png?
- 24. ¿Es posible trazar una imagen en un mapa con matplotlib?
- 25. ¿Detecta si un UIImage es PNG o JPEG?
- 26. ¿Es posible definir un tamaño de fuente preciso al dibujar texto usando GDI +?
- 27. Dibujando una cadena que sigue una ruta usando GDI +
- 28. ¿Cómo puedo cambiar el color de fondo de una imagen usando GDI +?
- 29. Redimensionar imagen PNG
- 30. Comprobar si un archivo es una imagen
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