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' 객체를 반드시 폐기하십시오! '(비트 맵 비트 맵 = 새 비트 맵 (...)) {...}' – aholmes

+0

@aholmes 왜 사람들은 비트 맵 객체를 처리해야할지 걱정해야합니까? 구현자가 아니라 호출자의 책임입니다. –

+0

왜 내가 그 코멘트를 썼는지 잊어 버렸습니다. 나는'using (Bitmap bitmap = BitmapFromSource (...)) {...}'이라고 쓰고 싶다고 생각한다. – aholmes

관련 문제