Получение DrawingContext для wpf WriteableBitmap

Есть ли способ получить DrawingContext (или что-то подобное) для WriteableBitmap ? DrawLine есть, чтобы позволить вам называть простые DrawLine / DrawRectangle / etc, а не напрямую манипулировать необработанными пикселями.

Я нашел решение sixlettervariables наиболее работоспособным. Однако отсутствует «drawContext.Close ()». Согласно MSDN, «DrawingContext должен быть закрыт до того, как его содержимое может быть отображено». Результатом является следующая функция утилиты:

 public static BitmapSource CreateBitmap( int width, int height, double dpi, Action render) { DrawingVisual drawingVisual = new DrawingVisual(); using (DrawingContext drawingContext = drawingVisual.RenderOpen()) { render(drawingContext); } RenderTargetBitmap bitmap = new RenderTargetBitmap( width, height, dpi, dpi, PixelFormats.Default); bitmap.Render(drawingVisual); return bitmap; } 

Это можно легко использовать следующим образом:

 BitmapSource image = ImageTools.CreateBitmap( 320, 240, 96, drawingContext => { drawingContext.DrawRectangle( Brushes.Green, null, new Rect(50, 50, 200, 100)); drawingContext.DrawLine( new Pen(Brushes.White, 2), new Point(0, 0), new Point(320, 240)); }); 

Если вы не против использования System.Drawing вы можете сделать что-то вроде:

 var wb = new WriteableBitmap( width, height, dpi, dpi, PixelFormats.Pbgra32, null ); wb.Lock(); var bmp = new System.Drawing.Bitmap( wb.PixelWidth, wb.PixelHeight, wb.BackBufferStride, PixelFormat.Format32bppPArgb, wb.BackBuffer ); Graphics g = System.Drawing.Graphics.FromImage( bmp ); // Good old Graphics g.DrawLine( ... ); // etc... // ...and finally: g.Dispose(); bmp.Dispose(); wb.AddDirtyRect( ... ); wb.Unlock(); 

Мне интересно то же самое, поскольку в настоящее время я делаю что-то вроде:

 DrawingVisual drawingVisual = new DrawingVisual(); using (DrawingContext drawingContext = drawingVisual.RenderOpen()) { // // ... draw on the drawingContext // RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, dpi, dpi, PixelFormats.Default); bmp.Render(drawingVisual); image.Source = bmp; } 

Я пытаюсь использовать WriteableBitmap, чтобы разрешить многопоточный доступ к буферу пикселей, который в настоящее время не разрешен ни с помощью DrawingContext, ни с RenderTargetBitmap. Может быть, какая-то рутина WritePixels, основанная на том, что вы извлекли из RenderTargetBitmap, будет работать?

Похоже, что слово нет .


Для дальнейшего использования мы планируем использовать порт перезаписываемых расширений Bitmap для WPF.

Для решения, использующего только существующий код, любой из других предложений, упомянутых ниже, будет работать.

Другой способ решить эту проблему – использовать RenderTargetBitmap в качестве хранилища RenderTargetBitmap , как и в примере WriteableBitmap . Затем вы можете создавать и выдавать команды рисования WPF, когда захотите. Например:

 // create the backing store in a constructor var backingStore = new RenderTargetBitmap(200,200,97,97,PixelFormats.Pbgra32); myImage.Source = backingStore; // whenever you want to update the bitmap, do: var drawingVisual = new DrawingVisual(); var drawingContext = drawingVisual.RenderOpen(); { // your drawing commands go here drawingContext.DrawRectangle( Brushes.Red, new Pen(), new Rect(this.RenderSize)); } Render(drawingContext); drawingContext.Close(); backingStore.Render(drawingVisual); 

Если вы хотите перерисовать этот RenderTargetBitmap каждый кадр, вы можете поймать событие CompositionTarget.Rendering , например:

 CompositionTarget.Rendering += MyRenderingHandler; 
Interesting Posts

Кнопка удаления fragmentа кнопки Android Fragment

HashMap и int как ключ

Почему аргумент шаблона не может быть выведен, если он используется в качестве параметра шаблона для другого шаблона?

Корпоративная библиотека Unity vs Other IoC Containers

Список волшебных функций Scala

Есть ли у JavaScript метод, подобный «range ()» для создания диапазона в пределах предоставленных границ?

Зачем создавать «Implicitly Unwrapped Optionals», так как это означает, что вы знаете, что есть ценность?

При архивировании на DVD, должен ли я сделать зеркальную копию, подобную RAID 1?

Что такое scope / named_scope в рельсах?

Почему это регулярное выражение не работает в Java?

Правое смещение отрицательных чисел в C

Как использовать алгоритм SIFT для вычисления того, как похожи два изображения?

Компьютер не загружается, показывает ошибку PXE и ​​/ или «операционная система не найдена», «нет загрузочного устройства», «вставить загрузочный носитель» или другую аналогичную ошибку

Каков наилучший способ генерации случайных чисел в C ++?

Создать zip-файл: команда выполнения ошибок “” имеет статус 127

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