我为Silverlight应用程序编写自己的缓存以解决任何大小问题。 缓存工作正常,但它不适用于图像。 我把问题缩小到一个小的测试应用程序,它将BitmapImage转换为字节(模拟从缓存中读取它们),然后将这些字节转换回图像。
以下是代码:
public MainPage()
{
InitializeComponent();
firstImage.ImageOpened += first_Loaded;
}
void first_Loaded(object sender, RoutedEventArgs e)
{
var bmp = firstImage.Source;
var bytes = ToByteArray(bmp as BitmapImage);
otherImage.Source = CreateImageFromBytes(bytes);
}
private byte[] ToByteArray(BitmapImage bi)
{
var enc = new BitmapEncoder(bi);
return enc.GetBitmapData();
}
private BitmapImage CreateImageFromBytes(byte[] data)
{
var bitmapImage = new BitmapImage();
bitmapImage.ImageFailed += bitmapImage_ImageFailed;
var ms = new MemoryStream(data);
bitmapImage.SetSource(ms);
return bitmapImage;
}
void bitmapImage_ImageFailed(object sender, ExceptionRoutedEventArgs e)
{
Console.WriteLine(e.ErrorException.Message);
}
始终使用消息" AG_E_NETWORK_ERROR"引发ImageFailed事件。 我已经阅读了一些关于这个问题的内容,它似乎与图像的来源有所不同,但我肯定能够从内存中的字节加载图像吗?
任何想法如何解决这个问题?
我应该补充一点,转换为字节的工作正常,因为如果我将这些字节保存到磁盘,我可以打开图像。
答案 0 :(得分:2)
来自Silverlight中的备注BitmapImage page on MSDN:
BitmapImage可用于参考JPEG和PNG中的图像 文件格式。
不幸的是,您使用的BitmapEncoder
类似乎以BMP格式编码位图。因此,BitmapImage
无法解码编码缓冲区。
你必须找到一个BitmapEncoder的另一个实现,它能够编码JPEG或PNG。