Есть ли способ получить DrawingContext
(или что-то подобное) для WriteableBitmap
? То есть что позволит вам просто называть простые методы DrawLine
/DrawRectangle
/и т. д., а не напрямую манипулировать необработанными пикселями.Получение DrawingContext для wpf WriteableBitmap
ответ
Появляется the word is no.
На будущее, мы планируем использовать порт Writeable Bitmap Extensions для WPF.
Для решения, использующего только существующий код, любые другие рекомендации, упомянутые ниже, будут работать.
Я интересно то же самое, как и в настоящее время я делаю что-то вроде:
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, будет работать?
Если вы не возражаете против использования 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();
Я нашел решение sixlettervariables' наиболее работоспособной один. Однако отсутствует «drawContext.Close()». Согласно MSDN, «DrawingContext должен быть закрыт до того, как его содержимое может быть отображено». Результатом является следующая функция полезности:
public static BitmapSource CreateBitmap(
int width, int height, double dpi, Action<DrawingContext> 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));
});
Другой способ решения этой проблемы заключается в использовании 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;
- 1. Выполнение WriteableBitmap (Ex) vs DrawingContext
- 2. WPF DrawingContext слишком медленно
- 3. DrawingContext DrawGeometry on Canvas (wpf)
- 4. Render WriteableBitmap в WPF
- 5. WPF WriteableBitmap Memory Leak?
- 6. WPF WriteableBitmap и эффекты
- 7. WPF WriteableBitmap to byte array
- 8. Странный рисунок с DrawingContext в WPF
- 9. Wpf: Почему WriteableBitmap становится медленнее?
- 10. Рисовать формы XAML для DrawingContext?
- 11. Рендеринг в пользовательский DrawingContext
- 12. Как я могу визуализировать элемент управления wpf для DrawingContext?
- 13. МОФ создать прозрачный WriteableBitmap
- 14. WriteableBitmap Не меняет цвет пикселя в wpf
- 15. Сохранить WriteableBitmap в файл с помощью WPF
- 16. Нарисуйте «L» с помощью DrawingContext
- 17. Как установить индекс Z при использовании WPF DrawingContext?
- 18. WPF DrawingContext: Как сохранить существующий контент при рисовании нового контента?
- 19. Кадры в секунду с использованием класса DrawingContext WPF
- 20. Фильтрация DrawImage при рисовании повернутого изображения на WPF DrawingContext
- 21. Как вы можете скопировать часть writeablebitmap в другую writeablebitmap?
- 22. Рисование линий в WPF на DrawingContext с внешними линиями
- 23. Как рисовать флажок в WPF с использованием DrawingContext C#
- 24. Внедрить выбор в DrawingContext
- 25. ArgumentException при инициализации WriteableBitmap
- 26. Weird WriteableBitmap FromStream issue
- 27. WriteableBitmap недоступно?
- 28. DrawingContext adorner - можно рисовать stackpanel?
- 29. Convert WriteableBitmap pixel format to Bgra32 in C# wpf
- 30. Преобразование WriteableBitmap в BitmapImage с использованием BmpBitmapEncoder WPF
Это не официальное слово. Это просто какой-то парень, который что-то говорит на форуме. – 2012-01-03 12:22:59
Полученный пункт; обновленный текст. Полагаю, вы могли бы сказать, что это означало «официальный», как в «размещенном на форуме, контролируемом чиновниками, и не исправляемом ими», но это немного растягивается :) – 2012-01-04 13:44:41