2010-09-20 2 views

Répondre

41
private System.Drawing.Bitmap BitmapFromSource(BitmapSource bitmapsource) 
{ 
    System.Drawing.Bitmap bitmap; 
    using (MemoryStream outStream = new MemoryStream()) 
    { 
    BitmapEncoder enc = new BmpBitmapEncoder(); 
    enc.Frames.Add(BitmapFrame.Create(bitmapsource)); 
    enc.Save(outStream); 
    bitmap = new System.Drawing.Bitmap(outStream); 
    } 
    return bitmap; 
} 
+0

Il y a un problème: vous perdrez la transparence (pour un bitmap avec canal alpha). – sibvic

5

Ceci est une technique alternative qui fait la même chose. La réponse acceptée fonctionne, mais j'ai rencontré des problèmes avec les images qui avaient des canaux alpha (même après le passage à PngBitmapEncoder). Cette technique peut également être plus rapide car elle ne fait qu'une copie brute des pixels après la conversion au format de pixel compatible.

public Bitmap BitmapFromSource(System.Windows.Media.Imaging.BitmapSource bitmapsource) 
{ 
     //convert image format 
     var src = new System.Windows.Media.Imaging.FormatConvertedBitmap(); 
     src.BeginInit(); 
     src.Source = bitmapsource; 
     src.DestinationFormat = System.Windows.Media.PixelFormats.Bgra32; 
     src.EndInit(); 

     //copy to bitmap 
     Bitmap bitmap = new Bitmap(src.PixelWidth, src.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
     var data = bitmap.LockBits(new Rectangle(Point.Empty, bitmap.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
     src.CopyPixels(System.Windows.Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride); 
     bitmap.UnlockBits(data); 

     return bitmap; 
} 
+0

Assurez-vous de disposer de l'objet 'bitmap'! 'using (Bitmap bitmap = new Bitmap (...)) {...}' – aholmes

+0

@aholmes pourquoi les gens devraient s'inquiéter de l'objet 'bitmap' à éliminer? c'est la responsabilité de l'appelant, pas de l'exécutant –

+0

J'ai oublié pourquoi j'ai écrit ce commentaire. Je pense que j'avais l'intention d'écrire 'using (Bitmap bitmap = BitmapFromSource (...)) {...}' – aholmes