2010-09-20 17 views

cevap

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

Bir sorun var: saydamlığı kaybedersiniz (alfa kanalı olan bir bitmap için). – sibvic

5

Bu, aynı şeyi yapan alternatif bir tekniktir. Kabul edilen cevap işe yarıyor, ancak alfa kanalları olan görüntülerle (PngBitmapEncoder'a geçtikten sonra bile) sorunla karşılaştım. Bu teknik, aynı zamanda daha hızlı olabilir, çünkü uyumlu piksel formatına dönüştürüldükten sonra piksellerin ham bir kopyası.

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' nesnesini attığınızdan emin olun! 'kullanarak (Bitmap bitmap = yeni Bitmap (...)) {...}' – aholmes

+0

@aholmes neden insanlar bertaraf edilecek 'bitmap' nesnesi hakkında endişelenmeli? Arayanın sorumluluğu değil, uygulayıcı değil –

+0

Bu yorumu neden yazdığımı unuttum. Ben (Bitmap bitmap = BitmapFromSource (...)) {...} ' – aholmes