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) {