0

Webサイトから画像をダウンロードし、それらをbase-64文字列に変換してファイルにシリアル化し、逆シリアル化し、base-64文字列からSystem.Drawing.Imageに変換し、最後にSystem.Windows.Mediaに変換しようとしています。 .ImageSourceなので、UIにデータバインドできます。

    public static string ImageToString(Image image)
    {
        using (var ms = new MemoryStream())
        {
            if (image == null)
                image = Properties.Resources.blank_image;

            image.Save(ms, image.RawFormat);
            return Convert.ToBase64String(ms.ToArray());
        }
    }

    public static Image StringToImage(string imageString)
    {
        if (String.IsNullOrEmpty(imageString))
            return Properties.Resources.blank_image;

        var array = Convert.FromBase64String(imageString);
        using (var ms = new MemoryStream(array))
        {
            return Image.FromStream(ms);
        }
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return null;

        var image = (System.Drawing.Image)value;
        var bitmap = new System.Windows.Media.Imaging.BitmapImage();

        bitmap.BeginInit();

        MemoryStream memoryStream = new MemoryStream();
        image.Save(memoryStream, image.RawFormat);
        memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
        bitmap.StreamSource = memoryStream;

        bitmap.EndInit();

        return bitmap;
    }

image.Save(memoryStream, image.RawFormat)inConvert()がヒットすると、このかなり役に立たない例外が発生します。

タイプ'System.Runtime.InteropServices.ExternalException'の例外がSystem.Drawing.dllで発生しましたが、ユーザーコードでは処理されませんでした

追加情報:GDI+で一般的なエラーが発生しました。

Properties.Resources.blank_imageImageをImageSourceに変換することは正常に機能しますが、Base-64文字列をImageに変換することはできません。

4

1 に答える 1

1

特定の例外についてはわかりませんが(SaveFileDialogを使用した後にBitmap.Save()のGDI +で一般的なエラーが発生した場合を除きます)、別のオプションがあります。

Base 64文字列から直接変換し、BitmapDecoder.Create(...)を使用する方が幸運かもしれません。

たとえば、次のようなものです。

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value == null)
        return null;

    string imageBase64String = (string)value;
    byte[] imageAsBytes = Convert.FromBase64String(imageBase64String);

    using (var ms = new MemoryStream(imageAsBytes))
    {
        var decoder = System.Windows.Media.Imaging.BitmapDecoder.Create(ms, BitmapCreateOptions.None, BitmapCacheOptions.OnLoad);

        return decoder.Frames[0];
    }
} 
于 2012-12-14T03:40:20.333 に答える