由于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; } }} (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 正如您自己指出的那样,ImageTypeCheck.getImageType方法正在关闭流。您应该如何找到问题?该错误消息清楚地表明该流已被丢弃。剩下的就是找到罪魁祸首。调用堆栈显示抛出错误时正在调用ImageTools.IO.Gif.GifDecoder.Decode。所以它发生在那之前。幸运的是,在GifDecoder之前只有一种使用流的方法,即ImageTypeCheck.getImageType要解决此问题,只需从stream.Close方法中删除ImageTypeCheck.getImageType,然后将其替换为Seek以返回流的开头(GifDecoder希望该流位于图片的开头) )。stream.Seek(0, SeekOrigin.Begin); (adsbygoogle = window.adsbygoogle || []).push({});
07-28 02:13
查看更多