Есть ли хороший способ конвертировать между BitmapSource и Bitmap?

Насколько я могу судить, единственный способ конвертировать из BitmapSource в Bitmap – это небезопасный код … Как это (из Lesters WPF blog ):

myBitmapSource.CopyPixels(bits, stride, 0); unsafe { fixed (byte* pBits = bits) { IntPtr ptr = new IntPtr(pBits); System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap( width, height, stride, System.Drawing.Imaging.PixelFormat.Format32bppPArgb,ptr); return bitmap; } } 

Чтобы сделать обратное:

 System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 

Есть ли более простой способ в рамках? И в чем причина этого нет (если это не так)? Я бы подумал, что это справедливо.

Причина, в которой я нуждаюсь, заключается в том, что я использую AForge для выполнения определенных операций с изображениями в приложении WPF. WPF хочет показать BitmapSource / ImageSource, но AForge работает с Bitmaps.

Можно обойтись без использования небезопасного кода с помощью Bitmap.LockBits и скопировать пиксели из BitmapSource прямо в Bitmap

 Bitmap GetBitmap(BitmapSource source) { Bitmap bmp = new Bitmap( source.PixelWidth, source.PixelHeight, PixelFormat.Format32bppPArgb); BitmapData data = bmp.LockBits( new Rectangle(Point.Empty, bmp.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb); source.CopyPixels( Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride); bmp.UnlockBits(data); return bmp; } 

Вы можете использовать эти два метода:

 public static BitmapSource ConvertBitmap(Bitmap source) { return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( source.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } public static Bitmap BitmapFromSource(BitmapSource bitmapsource) { Bitmap bitmap; using (var outStream = new MemoryStream()) { BitmapEncoder enc = new BmpBitmapEncoder(); enc.Frames.Add(BitmapFrame.Create(bitmapsource)); enc.Save(outStream); bitmap = new Bitmap(outStream); } return bitmap; } 

Он отлично работает для меня.

Это то, что вы ищете?

 Bitmap bmp = System.Drawing.Image.FromHbitmap(pBits); 

Здесь приведен код для установки прозрачного фона для любого растрового ресурса в словаре ресурсов (а не Resource.resx, который часто используется в возрасте Windows.Forms). Я называю этот метод перед InitializeComponent () – методу. Методы «ConvertBitmap (источник битмапа)» и BitmapFromSource (битмапсурс источника BitmapSource) упоминаются в сообщении от melvas выше.

 private void SetBitmapResourcesTransparent() { Image img; BitmapSource bmpSource; System.Drawing.Bitmap bmp; foreach (ResourceDictionary resdict in Application.Current.Resources.MergedDictionaries) { foreach (DictionaryEntry dictEntry in resdict) { // search for bitmap resource if ((img = dictEntry.Value as Image) is Image && (bmpSource = img.Source as BitmapSource) is BitmapSource && (bmp = BitmapFromSource(bmpSource)) != null) { // make bitmap transparent and assign it back to ressource bmp.MakeTransparent(System.Drawing.Color.Magenta); bmpSource = ConvertBitmap(bmp); img.Source = bmpSource; } } } } 

Это аккуратно и быстрее света:

  return Imaging.CreateBitmapSourceFromHBitmap( bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions() ); 

Вы можете делиться пиксельными координатами между обоими пространствами имен. Вам не нужно конвертировать.

Используйте SharedBitmapSource. https://stackoverflow.com/a/32841840/690656

  • Разница между {Binding PropertyName} и {Binding Path = PropertyName}
  • Анимация WPF: привязка к атрибуту «To» анимации раскадровки
  • Связывание WPF ComboBox с пользовательским списком
  • WPF Databinding: как мне получить доступ к «родительскому» контексту данных?
  • Как отобразить текст по умолчанию «--Select Team -» в поле со списком в pageload в WPF?
  • WPF TextBox для ввода десятичных значений
  • Горячие клавиши в WPF
  • Связывание WPF DataGridComboBoxColumn с MVVM
  • Ошибка привязки элемента ElementName
  • Разница между SelectedItem, SelectedValue и SelectedValuePath
  • Доступ к интерфейсу пользовательского интерфейса (Main) безопасно в WPF
  • Interesting Posts

    Как я могу написать задание cron, которое заблокирует мой интернет с 7 вечера до 7 утра? (Так что я могу немного поспать)

    Каков правильный способ связи между controllerами в AngularJS?

    Решения для представления слайдов PDF с примечаниями ведущего на втором дисплее

    MySQL UPDATE и SELECT за один проход

    Тот же сайт – две учетные записи пользователя

    Оценить математическое выражение из строки с помощью VB

    Как использовать SDK Google Диска в Android-проекте с жестко запрограммированными учетными данными

    Итерации по строкам из Sqlite-query

    Как проверить локальный Wi-Fi (не только сотовую связь) с помощью iPhone SDK?

    Можно ли «предварительно загрузить» все файлы thumbs.db в каталог?

    Почему проверка Windows Update настолько медленная?

    Кнопка мультитач для работы с Android

    Будет ли чистая установка Windows 8 распознать лицензионный ключ / ключ продукта OEM?

    JQuery multiselect – установить значение, выбранное в раскрывающемся списке «Мультиселекция»

    Атрибут MaxLength не генерирует атрибуты проверки на стороне клиента

    Давайте будем гением компьютера.