WPF中 通过socket 接收到的 JPG 二进制流如何转成 Image.Source ,原来的程序是用winform写的 同样的socket函数 获取到同样的二进制流,winform中直接使用
System.Drawing.Image img = System.Drawing.Image.FromStream(info.MemoryStream);
然后将img对象给到 pictureBox1.Image = img;
在wpf中 图片控件有所改变 使用的是 Image 对象 对应的图片属性是 Source 类型是 System.Windows.Media.ImageSource
找了一些转换方法
其中一个方法是:
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = info.MemoryStream;
image.EndInit();
转换无效 异常是:无法对此图像进行解码。该图像头可能已损坏。
我分析了一下 过来的二进制流式jpeg格式的,而 BitmapImage 字面意思应该是位图图像,所以转换失败。。
后来在 System.Windows.Media.Imaging 下找到了 一个 JpegBitmapDecoder
使用方法:
BitmapDecoder decoder = JpegBitmapDecoder.Create(info.MemoryStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
image1.Source = decoder.Frames[0];
同样无效。。图片还没没有出来
但是二进制流肯定是对了
我使用了
System.Drawing.Image img = System.Drawing.Image.FromStream(info.MemoryStream);
img.Save("i:\\pic\\" + DateTime.Now.Ticks + "_.jpg");
保存到磁盘 图片显示正常。
高手帮忙啊!!!!先谢过了!
问下 读取内存流的时候 有没有把指针设置到流开头呀
@tandly: info.MemoryStream.Position = 0; 亲测 有效
Dim bty() As Byte = System.Convert.FromBase64String(strImg)
ms.Write(bty, 0, bty.Length)
'ms.seek方法是解决无法读取jpg格式图片用
ms.Seek(0, SeekOrigin.Begin)
Dim bti As New BitmapImage()
bti.CacheOption = BitmapCacheOption.OnLoad
bti.BeginInit()
bti.StreamSource = MS
bti.EndInit()
看我的代码,关键在ms.seek(0,SeekOrigin.Begin)方法