/// <summary> /// Function to retrieve a list of frame delays for each frame in an animated GIF. /// </summary> /// <param name="stream">Stream containing the animated GIF.</param> /// <returns>An array of frame delays (1/100th of a second), or an empty array if the image is not an animated GIF.</returns> /// <exception cref="ArgumentNullException">Thrown when the <paramref name="stream"/> parameter is <b>null</b>.</exception> /// <exception cref="IOException">Thrown when the stream parameter is write-only. /// <para>-or-</para> /// <para>The data in the stream could not be decoded as GIF file.</para> /// <para>-or-</para> /// <para>The stream cannot perform seek operations.</para> /// </exception> /// <exception cref="EndOfStreamException">Thrown when an attempt to read beyond the end of the stream is made.</exception> /// <remarks> /// <para> /// This will return the delay (in 1/100ths of a second) between each frame in a multi-frame animated GIF. If the GIF file only has a single frame, then an empty array is returned. /// </para> /// </remarks> public IReadOnlyList <int> GetFrameDelays(Stream stream) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (!stream.CanRead) { throw new IOException(Resources.GORIMG_ERR_STREAM_IS_WRITEONLY); } if (!stream.CanSeek) { throw new IOException(Resources.GORIMG_ERR_STREAM_CANNOT_SEEK); } long position = stream.Position; var wic = new WicUtilities(); try { return(wic.GetFrameDelays(stream, SupportedFileFormat, "/grctlext/Delay")); } finally { stream.Position = position; } }