diff --git a/src/ImageSharp/Formats/Png/PngEncoderCore.cs b/src/ImageSharp/Formats/Png/PngEncoderCore.cs
index 36307d9e91..1053a25489 100644
--- a/src/ImageSharp/Formats/Png/PngEncoderCore.cs
+++ b/src/ImageSharp/Formats/Png/PngEncoderCore.cs
@@ -361,24 +361,36 @@ namespace ImageSharp.Formats
/// The
private byte[] GetOptimalFilteredScanline(byte[] rawScanline, byte[] previousScanline, int bytesPerScanline, int bytesPerPixel)
{
- Tuple[] candidates = new Tuple[4];
+ Tuple[] candidates;
- byte[] sub = SubFilter.Encode(rawScanline, bytesPerPixel, bytesPerScanline);
- candidates[0] = new Tuple(sub, this.CalculateTotalVariation(sub));
+ if (this.PngColorType == PngColorType.Palette)
+ {
+ candidates = new Tuple[4];
+
+ byte[] none = NoneFilter.Encode(rawScanline);
+ candidates[0] = new Tuple(none, this.CalculateTotalVariation(none));
+ }
+ else
+ {
+ candidates = new Tuple[4];
- byte[] up = UpFilter.Encode(rawScanline, bytesPerScanline, previousScanline);
- candidates[1] = new Tuple(up, this.CalculateTotalVariation(up));
+ byte[] sub = SubFilter.Encode(rawScanline, bytesPerPixel, bytesPerScanline);
+ candidates[0] = new Tuple(sub, this.CalculateTotalVariation(sub));
- byte[] average = AverageFilter.Encode(rawScanline, previousScanline, bytesPerPixel, bytesPerScanline);
- candidates[2] = new Tuple(average, this.CalculateTotalVariation(average));
+ byte[] up = UpFilter.Encode(rawScanline, bytesPerScanline, previousScanline);
+ candidates[1] = new Tuple(up, this.CalculateTotalVariation(up));
- byte[] paeth = PaethFilter.Encode(rawScanline, previousScanline, bytesPerPixel, bytesPerScanline);
- candidates[3] = new Tuple(paeth, this.CalculateTotalVariation(paeth));
+ byte[] average = AverageFilter.Encode(rawScanline, previousScanline, bytesPerPixel, bytesPerScanline);
+ candidates[2] = new Tuple(average, this.CalculateTotalVariation(average));
+
+ byte[] paeth = PaethFilter.Encode(rawScanline, previousScanline, bytesPerPixel, bytesPerScanline);
+ candidates[3] = new Tuple(paeth, this.CalculateTotalVariation(paeth));
+ }
int lowestTotalVariation = int.MaxValue;
int lowestTotalVariationIndex = 0;
- for (int i = 0; i < 4; i++)
+ for (int i = 0; i < candidates.Length; i++)
{
if (candidates[i].Item2 < lowestTotalVariation)
{