Conversión de formatos de píxeles de bitmap en C #

Necesito convertir un bitmap de PixelFormat.Format32bppRgb a PixelFormat.Format32bppArgb .

Esperaba usar Bitmap.Clone, pero parece que no funciona.

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

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

Sloppy, no es raro para 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... 

Por alguna razón, si crea un Bitmap de Bitmap partir de una ruta de archivo, es decir, Bitmap bmp = new Bitmap("myimage.jpg"); y llama a Clone() , el Bitmap devuelto no se convertirá.

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

Pruebe 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. } 
 using (var bmp = new Bitmap(width, height, PixelFormat.Format24bppArgb)) using (var g = Graphics.FromImage(bmp)) { g.DrawImage(..); } 

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