Преобразование System.Windows.Media.Imaging.BitmapSource в System.Drawing.Image

После того, как argv был передан в метод main, вы можете обращаться с ним как с любым другим массивом C - меняйте его по своему усмотрению, просто помните, что вы делаете с ним. Содержимое массива не влияет на код возврата или выполнение программы, кроме того, что вы явно делаете с ним в коде. Я не могу придумать причину, по которой было бы «нецелесообразно» относиться к этому особо.

Конечно, вам все равно нужно позаботиться о случайном доступе к памяти за пределами argv. С другой стороны, он доступен, как обычный массив C, в том, что он также подвержен ошибкам доступа, как и любой другой обычный массив C. (Спасибо всем, кто указал на это в комментариях и других ответах!)

27
задан Drew Noakes 12 October 2016 в 09:13
поделиться

2 ответа

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;
}
47
ответ дан 28 November 2019 в 04:54
поделиться

Это альтернативная техника, которая делает то же самое. Принятый ответ работает, но я столкнулся с проблемами с изображениями, которые имели альфа-каналы (даже после переключения на 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;
}
10
ответ дан 28 November 2019 в 04:54
поделиться