Browse Source

Squeeze a couple more ms out of png encode

pull/85/head
James Jackson-South 9 years ago
parent
commit
19d143912a
  1. 29
      src/ImageSharp.Formats.Png/PngEncoderCore.cs

29
src/ImageSharp.Formats.Png/PngEncoderCore.cs

@ -362,42 +362,43 @@ namespace ImageSharp.Formats
private byte[] GetOptimalFilteredScanline(byte[] rawScanline, byte[] previousScanline, byte[] result) private byte[] GetOptimalFilteredScanline(byte[] rawScanline, byte[] previousScanline, byte[] result)
{ {
// Palette images don't compress well with adaptive filtering. // Palette images don't compress well with adaptive filtering.
if (this.PngColorType == PngColorType.Palette) if (this.PngColorType == PngColorType.Palette || this.bitDepth < 8)
{ {
NoneFilter.Encode(rawScanline, result); NoneFilter.Encode(rawScanline, result);
return result; return result;
} }
SubFilter.Encode(rawScanline, this.sub, this.bytesPerPixel); // This order, while different to the enumerated order is more likely to produce a smaller sum
int currentSum = this.CalculateTotalVariation(this.sub, int.MaxValue); // early on which shaves a couple of milliseconds off the processing time.
UpFilter.Encode(rawScanline, previousScanline, this.up);
int currentSum = this.CalculateTotalVariation(this.up, int.MaxValue);
int lowestSum = currentSum; int lowestSum = currentSum;
result = this.up;
result = this.sub; PaethFilter.Encode(rawScanline, previousScanline, this.paeth, this.bytesPerPixel);
currentSum = this.CalculateTotalVariation(this.paeth, currentSum);
UpFilter.Encode(rawScanline, previousScanline, this.up);
currentSum = this.CalculateTotalVariation(this.up, currentSum);
if (currentSum < lowestSum) if (currentSum < lowestSum)
{ {
lowestSum = currentSum; lowestSum = currentSum;
result = this.up; result = this.paeth;
} }
AverageFilter.Encode(rawScanline, previousScanline, this.average, this.bytesPerPixel); SubFilter.Encode(rawScanline, this.sub, this.bytesPerPixel);
currentSum = this.CalculateTotalVariation(this.average, currentSum); currentSum = this.CalculateTotalVariation(this.sub, int.MaxValue);
if (currentSum < lowestSum) if (currentSum < lowestSum)
{ {
lowestSum = currentSum; lowestSum = currentSum;
result = this.average; result = this.sub;
} }
PaethFilter.Encode(rawScanline, previousScanline, this.paeth, this.bytesPerPixel); AverageFilter.Encode(rawScanline, previousScanline, this.average, this.bytesPerPixel);
currentSum = this.CalculateTotalVariation(this.paeth, currentSum); currentSum = this.CalculateTotalVariation(this.average, currentSum);
if (currentSum < lowestSum) if (currentSum < lowestSum)
{ {
result = this.paeth; result = this.average;
} }
return result; return result;

Loading…
Cancel
Save