3

Windows Phone は gif が扱えないので、ちょっと方法を書いてみたのですが、ちょっとエラーが出てしまったようです。
以下のコードは、(JPG および PNG 部分)bitimg.SetSource(e.Result); に対して実行されると、常に例外をスローします。
それが言ったように、それは処分されているので、私は e.Result を使用できないということですか? しかし、メソッドが停止していないのに、なぜコンパイラはそれを破棄するのでしょうか?

なぜ、どのように解決するのですか?

エラー情報:

{System.ObjectDisposedException: 破棄されたオブジェクトにアクセスできません。オブジェクト名: 'MS.Internal.InternalMemoryStream'。MS.Internal.InternalMemoryStream.Seek(Int64 オフセット、SeekOrigin 原点) で ImageTools.IO.Gif.GifDecoder.Decode(ExtendedImage 画像、ストリーム ストリーム) で xicihutong.ViewModel.RichTextBoxBindingBehavior.<>c__DisplayClass7.b__4(Object s, OpenReadCompletedEventArgs e ) System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e) で System.Net.WebClient.OpenReadOperationCompleted(Object arg)} で

image.Loaded += (s1, e1) =>
{
    WebClient wc = new WebClient();
    wc.AllowReadStreamBuffering = true;
    wc.OpenReadCompleted += (s, e) =>
    {
        if (e.Error == null && !e.Cancelled)
        {
            //Check the type of the Image
            ImageTypeCheck.ImageType incomingIMGType = ImageTypeCheck.getImageType(e.Result);

            BitmapImage bitimg = new BitmapImage();
            bitimg.CreateOptions = BitmapCreateOptions.BackgroundCreation;

            switch (incomingIMGType)
            {
                //handle GIF for windows phone
                case ImageTypeCheck.ImageType.Gif:
                    Decoders.AddDecoder<GifDecoder>();
                    Encoders.AddEncoder<JpegEncoder>();
                    GifDecoder gif = new GifDecoder();
                    JpegEncoder jpg = new JpegEncoder();
                    ImageTools.ExtendedImage extImg = new ImageTools.ExtendedImage();
                    gif.Decode(extImg, e.Result);
                    using (MemoryStream stream = new MemoryStream())
                    {
                        jpg.Encode(extImg, stream);
                        bitimg.SetSource(stream);
                        image.Source = bitimg;
                    }
                    break;
                case ImageTypeCheck.ImageType.Bmp:
                case ImageTypeCheck.ImageType.Null:
                    break;
                case ImageTypeCheck.ImageType.Jpg:
                case ImageTypeCheck.ImageType.Png:
                    try
                    {
                        bitimg.SetSource(e.Result);
                        image.Source = bitimg;
                    }
                    catch (Exception ex)
                    {
                        App.print(ex.Message);
                    }
                    break;
            }
        }
    };
    wc.OpenReadAsync(new Uri(item, UriKind.Absolute), wc);

}

==================================

using System.IO;

namespace xicihutong.DataServiceAgent
{
    class ImageTypeCheck
    {
        /// <summary>
        /// define
        /// </summary>
        public enum ImageType
        {
            Null,Png,Jpg,Gif,Bmp
        }


        public static ImageType getImageType(Stream stream)
        {
            ImageType type = ImageType.Null;

            byte[] header = new byte[8];
            stream.Read(header, 0, 8);

            //Check if PNG then do something;
            //Check if JPG then do something;
            //Check if GIF then do something;

            stream.Close();

            return type;
        }
    }
}
4

1 に答える 1

4

あなたが指摘したように、ImageTypeCheck.getImageTypeメソッドはストリームを閉じています。

問題をどのように見つけることになっていましたか?

  1. エラー メッセージは、ストリームが破棄されたことを明確に示しています。残ったのは犯人を見つけることだけでした。
  2. ImageTools.IO.Gif.GifDecoder.Decodeコールスタックは、エラーがスローされたときに が呼び出されていたことを示しています。だからその前に起こった。
  3. 幸いなことに、GifDecoder の前にストリームを使用するメソッドは 1 つしかありません。ImageTypeCheck.getImageType

この問題を解決するには、メソッドstream.Closeから を削除し、ストリームの先頭に戻るために に置き換えます (GifDecoder は、ストリームがピクチャの先頭に配置されることを想定しています)。ImageTypeCheck.getImageTypeSeek

stream.Seek(0, SeekOrigin.Begin);
于 2013-05-30T19:15:35.053 に答える