web-dev-qa-db-fra.com

Conversion de PixelFormats Bitmap en C #

J'ai besoin de convertir un bitmap de PixelFormat.Format32bppRgb à PixelFormat.Format32bppArgb.

J'espérais utiliser Bitmap.Clone, mais cela ne semble pas fonctionner.

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

Si j'exécute le code ci-dessus et vérifie ensuite clone.PixelFormat, il est défini sur PixelFormat.Format32bppRgb. Que se passe-t-il/comment convertir le format?

44
Jono

Sloppy, pas rare pour GDI +. Cela le corrige:

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...
80
Hans Passant

Pour une raison quelconque, si vous créez un Bitmap à partir d'un chemin de fichier, c'est-à-dire Bitmap bmp = new Bitmap("myimage.jpg");, et que vous appelez Clone() dessus, le Bitmap renvoyé ne sera pas converti.

Cependant, si vous créez un autre Bitmap à partir de votre ancien Bitmap, Clone() fonctionnera comme prévu.

Essayez quelque chose comme ceci:

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

Devrait fonctionner comme ça. Vous souhaitez peut-être définir certains paramètres sur g pour définir le mode d'interpolation pour la qualité, etc.

7
Benjamin Podszun