2010-01-06 14 views
36

que necesitan para convertir un Mapa de bits en PixelFormat.Format32bppRgb a PixelFormat.Format32bppArgb.Conversión PixelFormats de mapa de bits en C#

Tenía la esperanza de utilizar Bitmap.Clone, pero no parece estar funcionando.

Bitmap orig = new Bitmap("orig.bmp"); 
Bitmap clone = orig.Clone(new Rectangle(0,0,orig.Width,orig.Height), PixelFormat.Format24bppArgb); 

Si funciono con el código anterior y luego verifique clone.PixelFormat se establece en PixelFormat.Format32bppRgb. ¿Qué está pasando/cómo convierto el formato?

+1

¿Este sólo ocurren en XP? Encontré el problema en XP, pero parece funcionar bien en Windows 7. La solución de Hans lo solucionó. – Sugrue

+1

Eso es un poco gracioso. Tengo una solución que funciona bien en XP, pero se rompe, dando este error, en Windows 7 ... –

+0

puedo confirmar que sólo se ve afectada XP. – PMF

Respuesta

71

descuidado, no es raro que GDI +. Esto lo arregla:

Bitmap orig = new Bitmap(@"c:\temp\24bpp.bmp"); 
Bitmap clone = new Bitmap(orig.Width, orig.Height, 
    System.Drawing.Imaging.PixelFormat.Format32bppPArgb); 

using (Graphics gr = Graphics.FromImage(clone)) { 
    gr.DrawImage(orig, new Rectangle(0, 0, clone.Width, clone.Height)); 
} 

// Dispose orig as necessary... 
+0

tuve un problema similar al OP, excepto que tenía problemas con un archivo TIFF 48BppRgb que se guardó como 32BppArgb PNG?. GDI + no se pudo convertir correctamente y la imagen resultante fue muy oscura. Esta solución me permitió resolver ese problema al redibujar manualmente la imagen como 32BppRgb, por lo que +1. –

7
using (var bmp = new Bitmap(width, height, PixelFormat.Format24bppArgb)) 
using (var g = Graphics.FromImage(bmp)) { 
    g.DrawImage(..); 
} 

Debería funcionar así. Tal vez usted quiere establecer algunos parámetros en g para definir el modo de interpolación de calidad, etc.

+0

InterpolationMode es para escalar, realmente no creo que quiera escalarlo. Tal vez hacer algo como bmp.SetResolution (old.HorizontalResolution, old.VerticalResolution) y llamar a g.DrawImageUnscaled (edad, 0,0). Pero es sólo mi opinión :) – lauCosma

+0

@Elmue - ¿tienes alguna referencia a su estado de MSDN indica otra .. – ephraim

28

Por alguna razón, si se crea un Bitmap de una ruta de archivo, es decir Bitmap bmp = new Bitmap("myimage.jpg");, y llamar Clone() en él, el Bitmap devuelto no serán convertidos.

Sin embargo, si crea otro Bitmap desde su anterior Bitmap, Clone() funcionará según lo previsto.

intentar algo como esto:

using (Bitmap oldBmp = new Bitmap("myimage.jpg")) 
using (Bitmap newBmp = new Bitmap(oldBmp)) 
using (Bitmap targetBmp = newBmp.Clone(new Rectangle(0, 0, newBmp.Width, newBmp.Height), PixelFormat.Format32bppArgb)) 
{ 
    // targetBmp is now in the desired format. 
} 
+3

+1 Gracias Dan7 por explicar lo que fue el gatillo. He visto 'nuevo mapa de bits (nuevo mapa de bits (" imagen.jpg "))' antes pero no sabía por qué funcionó. –

+0

¿hay una manera fácil de 'Clonar' y convertir todas las páginas del mapa de bits? Me di cuenta de que 'targtBmp' solo tiene el marco activo en' oldBmp'. –

Cuestiones relacionadas