我的WP7应用程序有一个Image控件,其Source在XAML中设置为一个图像,其Build Action设置为Content:
<Image x:Name="MyImage" Source="/Images/myimage.png"/>
我需要将此图像作为字节数组存储在我的SqlCe数据库中。这是我目前转换为byte []的代码:
public byte[] ImageToArray() {
BitmapImage image = new BitmapImage();
image.CreateOptions = BitmapCreateOptions.None;
image.UriSource = new Uri( "/Images/myimage.png", UriKind.Relative );
WriteableBitmap wbmp = new WriteableBitmap( image );
return wbmp.ToArray();
}
字节数组保存到数据库,但是当我检索并且我的转换器尝试将其转换回(在不同的页面上)时,我得到“未指定的错误”。这是我的转换器:
public class BytesToImageConverter : IValueConverter {
public object Convert( object Value, Type TargetType, object Parameter, CultureInfo Culture ) {
if( Value != null && Value is byte[] ) {
byte[] bytes = Value as byte[];
using( MemoryStream stream = new MemoryStream( bytes ) ) {
stream.Seek( 0, SeekOrigin.Begin );
BitmapImage image = new BitmapImage();
image.SetSource( stream ); // Unspecified error here
return image;
}
}
return null;
}
public object ConvertBack( object Value, Type TargetType, object Parameter, CultureInfo Culture ) {
throw new NotImplementedException( "This converter only works for one way binding." );
}
}
我做了很多搜索。至于转换器,我的代码非常标准。我已经看到提到stream.Position = 0;
是必要的,但我的理解是stream.Seek
正在做同样的事情;我试过了两个。
由于我的转换器与我现在在十几个项目中使用的相同,我相信问题在于将Image控件的Source转换为字节数组,因此我的图像数据已损坏。在上面的代码中,我很难编写Uri,但我也尝试了
BitmapImage image = MyImage.Source as BitmapImage;
没有运气。我已经在这几个小时,在我的智慧结束。我错过了什么?
答案 0 :(得分:4)
我认为问题出在您的ImageToArray()
方法中。您正在将WriteableBitmap
对象转换为数组,但不是图像本身。尝试使用以下内容替换您的方法:
public byte[] ImageToArray()
{
BitmapImage image = new BitmapImage();
image.CreateOptions = BitmapCreateOptions.None;
image.UriSource = new Uri("/Images/myimage.png", UriKind.Relative);
WriteableBitmap wbmp = new WriteableBitmap(image);
MemoryStream ms = new MemoryStream();
wbmp.SaveJpeg(ms, wbmp.PixelWidth, wbmp.PixelHeight, 0, 100);
return ms.ToArray();
}
这个methd将图像作为jpg写入流,并返回字节。我还没有尝试过这些代码,但是使用转换器将其转换回BitmapImage
并不会有问题。
答案 1 :(得分:0)
image.UriSource中的byte []可能是base64 radix。您可以在SQL故事中浏览byte []或数据。 如果radix错误,则无法从byte []反向流。所以如果radix为64,则必须转换为16 radix。