diff --git a/src/ImageSharp/Formats/Gif/GifDecoderCore.cs b/src/ImageSharp/Formats/Gif/GifDecoderCore.cs
index 784d05da2..e73774a0c 100644
--- a/src/ImageSharp/Formats/Gif/GifDecoderCore.cs
+++ b/src/ImageSharp/Formats/Gif/GifDecoderCore.cs
@@ -35,7 +35,7 @@ namespace ImageSharp.Formats
///
/// The next frame.
///
- private ImageBase nextFrame;
+ private ImageFrame nextFrame;
///
/// The area to restore.
@@ -295,18 +295,20 @@ namespace ImageSharp.Formats
int imageWidth = this.logicalScreenDescriptor.Width;
int imageHeight = this.logicalScreenDescriptor.Height;
- ImageBase previousFrame = null;
+ ImageFrame previousFrame = null;
- ImageBase currentFrame;
+ ImageFrame currentFrame = null;
+
+ ImageBase image;
if (this.nextFrame == null)
{
- currentFrame = this.decodedImage;
+ image = this.decodedImage;
- currentFrame.Quality = colorTable.Length / 3;
+ image.Quality = colorTable.Length / 3;
// This initializes the image to become fully transparent because the alpha channel is zero.
- currentFrame.InitPixels(imageWidth, imageHeight);
+ image.InitPixels(imageWidth, imageHeight);
}
else
{
@@ -316,18 +318,18 @@ namespace ImageSharp.Formats
previousFrame = this.nextFrame;
}
- ImageFrame frame = this.nextFrame.ToFrame();
+ currentFrame = this.nextFrame.Clone();
- currentFrame = frame;
+ image = currentFrame;
- RestoreToBackground(currentFrame);
+ RestoreToBackground(image);
- this.decodedImage.Frames.Add(frame);
+ this.decodedImage.Frames.Add(currentFrame);
}
if (this.graphicsControlExtension != null && this.graphicsControlExtension.DelayTime > 0)
{
- currentFrame.FrameDelay = this.graphicsControlExtension.DelayTime;
+ image.FrameDelay = this.graphicsControlExtension.DelayTime;
}
int i = 0;
@@ -335,7 +337,7 @@ namespace ImageSharp.Formats
int interlaceIncrement = 8; // The interlacing line increment
int interlaceY = 0; // The current interlaced line
- using (PixelAccessor pixelAccessor = currentFrame.Lock())
+ using (PixelAccessor pixelAccessor = image.Lock())
{
using (PixelRow pixelRow = new PixelRow(imageWidth, ComponentOrder.XYZW))
{
@@ -409,7 +411,14 @@ namespace ImageSharp.Formats
return;
}
- this.nextFrame = currentFrame;
+ if (currentFrame == null)
+ {
+ this.nextFrame = this.decodedImage.ToFrame();
+ }
+ else
+ {
+ this.nextFrame = currentFrame.Clone();
+ }
if (this.graphicsControlExtension != null &&
this.graphicsControlExtension.DisposalMethod == DisposalMethod.RestoreToBackground)
diff --git a/src/ImageSharp/Image/Image.cs b/src/ImageSharp/Image/Image.cs
index 2915b5365..0bcf7c6eb 100644
--- a/src/ImageSharp/Image/Image.cs
+++ b/src/ImageSharp/Image/Image.cs
@@ -278,6 +278,11 @@ namespace ImageSharp
}
}
+ internal virtual ImageFrame ToFrame()
+ {
+ return new ImageFrame(this);
+ }
+
///
/// Loads the image from the given stream.
///
diff --git a/src/ImageSharp/Image/ImageBase.cs b/src/ImageSharp/Image/ImageBase.cs
index 72ed9fc3f..7e9ca2701 100644
--- a/src/ImageSharp/Image/ImageBase.cs
+++ b/src/ImageSharp/Image/ImageBase.cs
@@ -162,10 +162,5 @@ namespace ImageSharp
this.Quality = other.Quality;
this.FrameDelay = other.FrameDelay;
}
-
- internal virtual ImageFrame ToFrame()
- {
- return new ImageFrame(this);
- }
}
}
diff --git a/src/ImageSharp/Image/ImageFrame.cs b/src/ImageSharp/Image/ImageFrame.cs
index 130cbc609..d63618766 100644
--- a/src/ImageSharp/Image/ImageFrame.cs
+++ b/src/ImageSharp/Image/ImageFrame.cs
@@ -37,5 +37,10 @@ namespace ImageSharp
{
return $"ImageFrame: {this.Width}x{this.Height}";
}
+
+ internal virtual ImageFrame Clone()
+ {
+ return new ImageFrame(this);
+ }
}
}
diff --git a/src/ImageSharp/ImageFrame.cs b/src/ImageSharp/ImageFrame.cs
index 80e255fe6..760e559fd 100644
--- a/src/ImageSharp/ImageFrame.cs
+++ b/src/ImageSharp/ImageFrame.cs
@@ -38,7 +38,7 @@ namespace ImageSharp
}
///
- internal override ImageFrame ToFrame()
+ internal override ImageFrame Clone()
{
return new ImageFrame(this);
}