代码之家  ›  专栏  ›  技术社区  ›  Mizipzor

转换系统.Windows.Media.Imaging.bitmap源至系统图图像

  •  26
  • Mizipzor  · 技术社区  · 14 年前

    我要把两个图书馆连在一起。一个只给出类型的输出 System.Windows.Media.Imaging.BitmapSource ,另一个只接受类型的输入 System.Drawing.Image

    如何执行此转换?

    2 回复  |  直到 8 年前
        1
  •  49
  •   John Gietzen    14 年前
    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;
    }
    
        2
  •  12
  •   Rngbus    9 年前

    这是另一种做同样事情的技术。公认的答案是可行的,但我遇到了有alpha通道的图像的问题(即使在切换到pngbitmapcoder之后)。这种技术也可能更快,因为它只是在转换成兼容的像素格式后进行像素的原始拷贝。

    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;
    }