private static FrameMetadata GetFrameMetadata(BitmapDecoder decoder, GifFile gifMetadata, int frameIndex) { if (gifMetadata != null && gifMetadata.Frames.Count > frameIndex) { return(GetFrameMetadata(gifMetadata.Frames[frameIndex])); } return(GetFrameMetadata(decoder.Frames[frameIndex])); }
private static Int32Size GetFullSize(BitmapDecoder decoder, GifFile gifMetadata) { if (gifMetadata != null) { var lsd = gifMetadata.Header.LogicalScreenDescriptor; return(new Int32Size(lsd.Width, lsd.Height)); } int width = decoder.Metadata.GetQueryOrDefault("/logscrdesc/Width", 0); int height = decoder.Metadata.GetQueryOrDefault("/logscrdesc/Height", 0); return(new Int32Size(width, height)); }
private static RepeatBehavior GetActualRepeatBehavior(System.Windows.Controls.Image imageControl, BitmapDecoder decoder, GifFile gifMetadata) { // If specified explicitly, use this value var repeatBehavior = GetRepeatBehavior(imageControl); if (repeatBehavior != default(RepeatBehavior)) { return(repeatBehavior); } int repeatCount; if (gifMetadata != null) { repeatCount = gifMetadata.RepeatCount; } else { repeatCount = GetRepeatCount(decoder); } if (repeatCount == 0) { return(RepeatBehavior.Forever); } return(new RepeatBehavior(repeatCount)); }
private static BitmapDecoder GetDecoder(BitmapSource image, out GifFile gifFile) { gifFile = null; BitmapDecoder decoder = null; Stream stream = null; Uri uri = null; BitmapCreateOptions createOptions = BitmapCreateOptions.None; if (image is BitmapImage bmp) { createOptions = bmp.CreateOptions; if (bmp.StreamSource != null) { stream = bmp.StreamSource; } else if (bmp.UriSource != null) { uri = bmp.UriSource; if (bmp.BaseUri != null && !uri.IsAbsoluteUri) { uri = new Uri(bmp.BaseUri, uri); } } } else { if (image is BitmapFrame frame) { decoder = frame.Decoder; Uri.TryCreate(frame.BaseUri, frame.ToString(), out uri); } } if (decoder == null) { if (stream != null) { stream.Position = 0; decoder = BitmapDecoder.Create(stream, createOptions, BitmapCacheOption.OnLoad); } else if (uri != null && uri.IsAbsoluteUri) { decoder = BitmapDecoder.Create(uri, createOptions, BitmapCacheOption.OnLoad); } } if (decoder is GifBitmapDecoder && !CanReadNativeMetadata(decoder)) { if (stream != null) { stream.Position = 0; gifFile = GifFile.ReadGifFile(stream, true); } else if (uri != null) { gifFile = DecodeGifFile(uri); } else { throw new InvalidOperationException("Can't get URI or Stream from the source. AnimatedSource should be either a BitmapImage, or a BitmapFrame constructed from a URI."); } } if (decoder == null) { throw new InvalidOperationException("Can't get a decoder from the source. AnimatedSource should be either a BitmapImage or a BitmapFrame."); } return(decoder); }