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

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

20
задан Noam M 18 April 2016 в 07:26
поделиться

4 ответа

Это появляется , слово не .

<час>

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

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

4
ответ дан 29 November 2019 в 23:33
поделиться

Если вы не возражаете против использования 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();                    
16
ответ дан 29 November 2019 в 23:33
поделиться

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

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, работала бы?

5
ответ дан 29 November 2019 в 23:33
поделиться

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

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));
    });
19
ответ дан 29 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: