如何将Image.Source转换为字节数组
本文关键字:字节 字节数 数组 转换 Source Image | 更新日期: 2023-09-27 18:21:39
我的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;
没有运气。我已经做了好几个小时了,我已经无计可施了。我错过了什么?
我认为问题出在您的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();
}
此方法将图像以jpg格式写入流,并返回字节。我还没有尝试过该代码,但使用转换器将其转换回BitmapImage
应该不会有问题。
图像中的字节[]。UriSource可以是以64为基数的。您可以浏览SQL tale中的字节[]或数据。如果基数是错误的,就不能从字节[]反转为流。所以如果基数是64,就必须转换为16基数。