首页 新闻 会员 周边

WPF中 通过socket 接收到的 JPG 二进制流如何转成 Image.Source

0
悬赏园豆:30 [待解决问题]

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的主页 tandly | 初学一级 | 园豆:17
提问于:2010-12-28 15:49
< >
分享
所有回答(2)
0

问下  读取内存流的时候 有没有把指针设置到流开头呀

MSFT:waywa 韦恩卑鄙 | 园豆:303 (菜鸟二级) | 2010-12-28 16:46
try { info.MemoryStream.Position = 0; BitmapImage image = new BitmapImage(); image.BeginInit(); image.StreamSource = info.MemoryStream; image.EndInit(); image1.Source = image; info.MemoryStream.Dispose(); info.MemoryStream.Close(); } catch (Exception ex) { System.Console.WriteLine(); } 没用。。。
支持(0) 反对(0) tandly | 园豆:17 (初学一级) | 2010-12-28 16:55

@tandly: info.MemoryStream.Position = 0; 亲测 有效

支持(0) 反对(0) 朝曦 | 园豆:1073 (小虾三级) | 2015-06-26 20:37
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)方法

FunLove | 园豆:205 (菜鸟二级) | 2011-11-14 10:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册