Windows Phone 8.0 Blob to Image

时间:2014-06-12 21:41:55

标签: c# .net windows-phone-8 windows-phone

我有一个连接到数据库的Web服务,我需要通过Web服务从该BD中提取类型BLOB,然后创建一个Image。 Web服务从blob发送一个字节数组,我尝试使用转换器绑定到XML中的图像(就像我发现的一些建议),像这样

 using (Stream ms = new MemoryStream(fileBytes, 0, fileBytes.Length))
        {  
            ms.Write(fileBytes, 0, fileBytes.Length);
            ms.Seek(0, SeekOrigin.Begin);
            BitmapImage bitmapImage = new BitmapImage();
            ////////////////Exception here
            bitmapImage.SetSource(ms);
            return bitmapImage;
        }

然后我收到此错误(来自HRESULT: 0x88982F50的异常)。然后我发现可能是问题的字节数组的格式,也许可能在base64中,所以我改变了Web服务,现在它发送了一个64-Base字符串,然后改为字节数组,但仍然有相同的错误。

我找到this post但仍然没有运气。然后我发现了许多解决方案,例如InMemoryRandomAccessStreamImage.FromStream,但这些解决方案适用于WP 8.1

我也用过:

    image.SaveJpeg(stream, image.PixelWidth, image.PixelHeight, 0, 90);
    ///////AND////////
    image = PictureDecoder.DecodeJpeg(ms);

但仍然没有运气

我确信我错过了一些东西,因为每个解决方案都指出了这些解决方案,但我真的无法理解。

2 个答案:

答案 0 :(得分:0)

我使用以下函数完成此操作(将数据库中的二进制对象加载到图像中):

public static BitmapImage LoadImage(byte[] imageData)
{
    if (imageData == null || imageData.Length == 0) return null;
    var image = new BitmapImage();
    using (var mem = new MemoryStream(imageData))
    {
        mem.Position = 0;
        image.BeginInit();
        image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
        image.CacheOption = BitmapCacheOption.OnLoad;
        image.UriSource = null;
        image.StreamSource = mem;
        image.EndInit();
    }
    image.Freeze();
    return image;
}

如您所见,该函数将byte[]数组作为参数。我从数据库中得到这样的数组:

using (var reader = dataLayer.ExecuteReader(sqlString))
{
    if (reader.Read())
    {
        if (reader["ImageData"] != null && reader["ImageData"] != DBNull.Value)
        {
            imageBytes = (byte[])reader["ImageData"];
        }
    }
}

其中ImageData是数据库中的列名。然后调用LoadImage()函数,并将imageBytes作为参数传入。

答案 1 :(得分:0)

我终于明白了,实际上是DB的错误。我获取字节数组的列上的数据已损坏或有另一种我不理解的用法,所以我与数据库管理员联系,他帮助我,所以现在我有正确的数据。第一个代码确实有效。感谢大家的帮助