我有一个连接到数据库的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但仍然没有运气。然后我发现了许多解决方案,例如InMemoryRandomAccessStream
或Image.FromStream
,但这些解决方案适用于WP 8.1
我也用过:
image.SaveJpeg(stream, image.PixelWidth, image.PixelHeight, 0, 90);
///////AND////////
image = PictureDecoder.DecodeJpeg(ms);
但仍然没有运气
我确信我错过了一些东西,因为每个解决方案都指出了这些解决方案,但我真的无法理解。
答案 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的错误。我获取字节数组的列上的数据已损坏或有另一种我不理解的用法,所以我与数据库管理员联系,他帮助我,所以现在我有正确的数据。第一个代码确实有效。感谢大家的帮助