在 Windows Phone 和 Silverlight 中将 Image Feed 转换为 BitmapImage

Posted

技术标签:

【中文标题】在 Windows Phone 和 Silverlight 中将 Image Feed 转换为 BitmapImage【英文标题】:Converting Image Feed to BitmapImage in Windows Phone and Silverlight 【发布时间】:2011-12-02 08:06:32 【问题描述】:

我目前在将我从 Feed 获得的图像字符串转换为 Windows Phone 7.1 中的 BitmapImage 时遇到问题。我正在使用 oData Northwind 示例 http://services.odata.org/Northwind/Northwind.svc/Categories/。

这是类别中的实体之一。

<entry>
<id>http://localhost:32026/Northwind/Northwind.svc/Categories(1)</id>
<title type="text" />
<updated>2011-11-20T20:36:50Z</updated>
- <author>
<name />
</author>
<link rel="edit" title="Category" href="Categories(1)" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Products" type="application/atom+xml;type=feed" title="Products" href="Categories(1)/Products" />
<category term="NorthwindModel.Category" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
- <content type="application/xml">
- <m:properties>
<d:CategoryID m:type="Edm.Int32">1</d:CategoryID>
<d:CategoryName>Beverages</d:CategoryName>
<d:Description>Soft drinks, coffees, teas, beers, and ales</d:Description>
<d:Picture m:type="Edm.Binary">...data here.....</d:Picture>
</m:properties>
</content>
</entry>

我正在使用下面的代码将图片字符串转换为 BitmapImage,但我得到 “未指定的错误”.. 我也在 Silverlight 5 中进行了测试。我没有错误,但无法显示图像。这是编码问题还是其他问题?

public void LoadData() 

            HttpWebRequest request =
                (HttpWebRequest)HttpWebRequest.Create(@"http://services.odata.org/Northwind/Northwind.svc/Categories/");
            request.Method = "GET";
            request.BeginGetResponse(new AsyncCallback(ReadCallback), request);

        

        private void ReadCallback(IAsyncResult result) 

            Deployment.Current.Dispatcher.BeginInvoke(() => 
                HttpWebRequest request = (HttpWebRequest)result.AsyncState;
                HttpWebResponse response = request.EndGetResponse(result)
                                                as HttpWebResponse;

                XNamespace nsBase = "http://services.odata.org/Northwind/Northwind.svc/Categories/";
                XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
                XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
                XNamespace atom = "http://www.w3.org/2005/Atom";

                if (response.StatusCode == HttpStatusCode.OK) 
                    var xdoc = XDocument.Load(response.GetResponseStream());
                    foreach (var entity in xdoc.Descendants(atom + "entry")) 
                        var properties = entity.Element(atom + "content")
                                               .Element(m + "properties");

                        byte[] byteArray = Convert.FromBase64String(properties.Element(d + "Picture").Value);
                        var bitmapImage = new BitmapImage()  CreateOptions = BitmapCreateOptions.DelayCreation ;
                        MemoryStream stream = new MemoryStream(byteArray);
                        //stream.Read(byteArray, 0, Convert.ToInt32(stream.Length));
                        //stream.Seek(0, SeekOrigin.Begin);
                        bitmapImage.SetSource(stream);

                        var category = new CategoryModel() 
                            Id = Convert.ToInt32(properties.Element(d + "CategoryID").Value),
                            Name = properties.Element(d + "CategoryName").Value,
                            Description = properties.Element(d + "Description").Value,
                            Picture = bitmapImage
                        ;
                        Items.Add(category);
                    
                
                else 
                    MessageBox.Show("Exception");
                
            );

        

【问题讨论】:

【参考方案1】:

阅读此页面。它会帮助你。

http://blogs.msdn.com/b/astoriateam/archive/2011/05/17/accessing-an-odata-media-resource-stream-from-a-windows-phone-7-application-streaming-provider-series-part-3.aspx

【讨论】:

谢谢!那篇文章和我的代码之间的区别在于我没有使用自动生成的代理或 oData 客户端。正如您在此链接services.odata.org/Northwind/Northwind.svc/Categories. 中看到的提要,图像采用 base64 格式或其他格式。我正在尝试将该图像字符串转换为 BitmapImage.. 很久以前我读到,Northwind 数据库是首先使用 MS Access 创建的,并且存储的图像添加了 78 字节的 OLE 标头。我想你需要从图像数据中删除 78 字节的标题。

以上是关于在 Windows Phone 和 Silverlight 中将 Image Feed 转换为 BitmapImage的主要内容,如果未能解决你的问题,请参考以下文章

windows phone 8 和 10 的 windows phone 应用程序开发

在Windows Phone 8上平滑缩放和平移

在 windows phone 8 和 windows 8 中使用 Google Play 游戏服务

Windows Phone 8 与 windows 8 开发技术概览

Windows Phone 8 与 windows 8 开发技术概览

如何在 Windows Phone App 中浏览和上传文件