Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Это появляется , слово не .
<час>Для дальнейшего использования, мы планируем использовать порт Записываемые Растровые Расширения для WPF.
Для решения с помощью чисто существующего кода, любое из других предложений, упомянутых ниже, будет работать.
Если вы не возражаете против использования 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, работала бы?
Я нашел решение с шестизначными переменными наиболее работоспособным. Однако отсутствует «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));
});