2010-09-20 5 views

ответ

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

Существует одна проблема: вы потеряете прозрачность (для растрового изображения с альфа-каналом). – sibvic

5

Это альтернативная техника, которая делает то же самое. Принятый ответ работает, но я столкнулся с проблемами с изображениями с альфа-каналами (даже после переключения на PngBitmapEncoder). Этот метод также может быть более быстрым, поскольку он просто выполняет необработанную копию пикселей после преобразования в формат совместимого пикселя.

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

Обязательно удалите объект 'bitmap'! 'using (Bitmap bitmap = new Bitmap (...)) {...}' – aholmes

+0

@aholmes Почему люди должны беспокоиться об объекте 'bitmap', который должен быть удален? это ответственность вызывающего, а не исполнителя –

+0

Я забыл, почему я написал этот комментарий. Думаю, я намеревался написать 'using (Bitmap bitmap = BitmapFromSource (...)) {...}' – aholmes