2

我的 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;

没有运气。我一直在这几个小时,我的智慧结束了。我错过了什么?

4

2 回答 2

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();
    }

此方法将图像以 jpg 格式写入流,并返回字节。我没有尝试过代码,但是使用转换器将其转换回 a 应该没有问题BitmapImage

于 2013-07-10T09:37:12.267 回答
0

image.UriSource 中的 byte[] 可能是 base64 基数。您可以浏览 byte[] 或 SQL 故事中的数据。如果基数错误,不能从 byte[] 反转到流。所以如果基数是 64,必须转换为 16 基数。

于 2013-07-10T00:54:26.417 回答