我有一个带有Image
控件的WPF应用程序。
我正在使用WriteableBitmap
来更新Image.source
,但我无法理解为什么会看到这种奇怪的行为:我的图像分为两部分,顶部部分以非常慢的速度缓慢移动到底部。
我不明白为什么会这样。顶部和底部部分实际上是相同的框架,因为我可以看到它们的实时更新。
我的代码:
public MainWindow()
{
InitializeComponent();
InitVideo();
image.Source = frame;
}
private void InitVideo
{
/// .... some other init stuff ...
frame = new WriteableBitmap(width, height, 96, 96, PixelFormats.Rgb24, null);
rgbch = new byte[stride * height];
dataProc = new System.Threading.Thread(ReadData);
dataProc.Start();
}
// in separate thread
private void ReadData()
{
while (rxVideo)
{
for (int i = 0; i < rgbch.Length; i += stride)
{
pipe.Read(rgbch, i, stride);
}
Application.Current.Dispatcher.Invoke(() =>
{
frame.Lock();
frame.WritePixels(new Int32Rect(0, 0, width, height), rgbch, stride, 0);
frame.Unlock();
});
}
我尝试使用frame.dispatcher.invoke
- &gt;同样的结果。
尝试Marshal.Copy
- &gt;同样的结果..
答案 0 :(得分:1)
我找到了问题的根源。
这是由我的代码内部线程
引起的 for (int i = 0; i < rgbch.Length; i += stride)
{
pipe.Read(rgbch, i, stride);
}
rgbch
被设置为writablebitmap backbuffer的源,所以当我在其中写入新数据时,更新工作缓慢,所以我得到了奇怪的上下更新。
我刚刚做了pipe.read(rgbch, 0, rgbch.Length)
,所有这一切都运行得更快,没有图像边界。
答案 1 :(得分:0)
这几乎与您的代码无关。可能是因为:
你应该在几年前逐行寻找显示图像的原因。在那些年里,互联网带宽非常低,这是一种让用户在完全加载之前看到图像的技术。我知道你知道这一点。我只是写了它来完成答案!