在设置 Image.Source 后更新 WritableBitmap
Update WritableBitmap after Image.Source has been set
我正在尝试使用 WritableBitmap
对位图进行一些像素级操作 images.But 我做不到 working.What 我想做的是操作 WritableBitmap
在我用我的 bitmap.I 谷歌搜索分配 Image.Source
属性 之后,我唯一发现的是调用 bitmap.Invalidate()
方法,但它似乎被弃用了,因为我不能在 WritableBitmap
class.following 中找到该方法是我用来更新图像但运气不好的代码:
wbitmap.Lock();
wbitmap.WritePixels(rect, pixels, stride, 0);
wbitmap.AddDirtyRect(new Int32Rect(0, 0, width, height));
wbitmap.Unlock();
//given that i've already assigned image.Source with "wbitmap"
image.InvalidateVisual();
对此有什么想法吗?
编辑
我将不胜感激任何关于 FAST 二维绘图在 WPF 中比 WritableBitmap
.
更好的建议
下面的简单示例演示了如何在分配给图像控件的源 属性 时连续写入 WriteableBitmap。
XAML就是这样:
<Window ...>
<Grid>
<Image x:Name="image"/>
</Grid>
</Window>
在后面的代码中有一个计时器每秒用随机像素颜色值覆盖 WriteableBitmap 十次。请注意,您必须在 Visual Studio 项目属性(在构建选项卡中)中允许不安全代码。
除了 Lock
/AddDirtyRect
/Unlock
,您还可以调用 writePixels
。但是,Lock
方法还允许另一个 non-UI 线程写入 BackBuffer
.
public partial class MainWindow : Window
{
private readonly WriteableBitmap bitmap
= new WriteableBitmap(100, 100, 96, 96, PixelFormats.Bgr32, null);
public MainWindow()
{
InitializeComponent();
image.Source = bitmap;
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(0.1) };
timer.Tick += OnTimerTick;
timer.Start();
}
private unsafe void OnTimerTick(object sender, EventArgs e)
{
int pixelValue = (int)DateTime.Now.Ticks & 0xFFFFFF;
bitmap.Lock();
var backBuffer = bitmap.BackBuffer;
for (int y = 0; y < bitmap.PixelHeight; y++)
{
for (int x = 0; x < bitmap.PixelWidth; x++)
{
var bufPtr = backBuffer + bitmap.BackBufferStride * y + x * 4;
*((int*)bufPtr) = pixelValue;
}
}
bitmap.AddDirtyRect(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));
bitmap.Unlock();
}
}
我正在尝试使用 WritableBitmap
对位图进行一些像素级操作 images.But 我做不到 working.What 我想做的是操作 WritableBitmap
在我用我的 bitmap.I 谷歌搜索分配 Image.Source
属性 之后,我唯一发现的是调用 bitmap.Invalidate()
方法,但它似乎被弃用了,因为我不能在 WritableBitmap
class.following 中找到该方法是我用来更新图像但运气不好的代码:
wbitmap.Lock();
wbitmap.WritePixels(rect, pixels, stride, 0);
wbitmap.AddDirtyRect(new Int32Rect(0, 0, width, height));
wbitmap.Unlock();
//given that i've already assigned image.Source with "wbitmap"
image.InvalidateVisual();
对此有什么想法吗?
编辑
我将不胜感激任何关于 FAST 二维绘图在 WPF 中比 WritableBitmap
.
下面的简单示例演示了如何在分配给图像控件的源 属性 时连续写入 WriteableBitmap。
XAML就是这样:
<Window ...>
<Grid>
<Image x:Name="image"/>
</Grid>
</Window>
在后面的代码中有一个计时器每秒用随机像素颜色值覆盖 WriteableBitmap 十次。请注意,您必须在 Visual Studio 项目属性(在构建选项卡中)中允许不安全代码。
除了 Lock
/AddDirtyRect
/Unlock
,您还可以调用 writePixels
。但是,Lock
方法还允许另一个 non-UI 线程写入 BackBuffer
.
public partial class MainWindow : Window
{
private readonly WriteableBitmap bitmap
= new WriteableBitmap(100, 100, 96, 96, PixelFormats.Bgr32, null);
public MainWindow()
{
InitializeComponent();
image.Source = bitmap;
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(0.1) };
timer.Tick += OnTimerTick;
timer.Start();
}
private unsafe void OnTimerTick(object sender, EventArgs e)
{
int pixelValue = (int)DateTime.Now.Ticks & 0xFFFFFF;
bitmap.Lock();
var backBuffer = bitmap.BackBuffer;
for (int y = 0; y < bitmap.PixelHeight; y++)
{
for (int x = 0; x < bitmap.PixelWidth; x++)
{
var bufPtr = backBuffer + bitmap.BackBufferStride * y + x * 4;
*((int*)bufPtr) = pixelValue;
}
}
bitmap.AddDirtyRect(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));
bitmap.Unlock();
}
}