我正在接收byte[]
图像数据(来自网络摄像头,通过网络传输),并希望在我的WPF图像控件中显示它。
如果我将分辨率设置为160x120,我会看到一个很好的小图像显示。
对于任何其他决议,虽然我看到了虚无,没有,zilch,深蹲。
如果我将原始字节写入磁盘,我可以看到数据确实是一个有效的jpg图像。 为了确保它不是jpeg不兼容,我用png和bmp编码/解码测试了它,结果相同;仍然没有形象。
任何人都有一个好主意?
private bool OnImage(byte[] inJpg)
{
this.Dispatch(() =>
{
//File.WriteAllBytes("h:\\tmp\\test" + sImageNum++ + ".jpg", inJpg);
using (MemoryStream ms = new MemoryStream(inJpg))
{
BitmapDecoder decoder = new JpegBitmapDecoder(ms, BitmapCreateOptions.None, BitmapCacheOption.Default);
ImageRemoteVideo.Source = decoder.Frames[0];
}
}
);
}
答案 0 :(得分:2)
假设ImageRemoteVideo是WPF图像控件的一个实例,您可能会遇到一些懒惰的解决问题。 Image控件具有您应该使用的“BeginInit”和“EndInit”方法。在设置流之前放置BeginInit方法,在设置之后放置另一个方法。另外,如果我没记错,Image类支持StreamSource。您可以尝试将MemoryStream(不需要处理它而不使用JpegBitmapDecoder)设置为该Property。如果可以,那么看看你是否可以在EndInit调用之后处理它。
答案 1 :(得分:0)
我刚刚找到了一种让它发挥作用的方法,但如果有人可以解释为什么它有效,我会很喜欢它:) 首先,我使用原始字节流来创建BitmapImage。 但是 - 如果我在MemoryStream周围使用“using”子句它不起作用,如果我不能它工作。
所以这不起作用:
using (MemoryStream byteStream = new MemoryStream(inJpg))
{
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = byteStream;
image.EndInit();
ImageRemoteVideo.Source = image;
}
但这样做:
MemoryStream byteStream = new MemoryStream(inJpg);
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = byteStream;
image.EndInit();
ImageRemoteVideo.Source = image;
答案 2 :(得分:0)
找到它。这就像布兰农说的延迟装载一样。 指定“CacheOption = BitmapCacheOption.OnLoad;”解决它!
干杯!
工作版:
MemoryStream byteStream = new MemoryStream(inJpg);
{
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = byteStream;
image.CacheOption = BitmapCacheOption.OnLoad;
image.EndInit();
ImageRemoteVideo.BeginInit();
ImageRemoteVideo.Source = image;
ImageRemoteVideo.EndInit();
}