Browse Source

Merge pull request #2582 from SixLabors/js/fix-quantizer-in-box

Fix boxed quantization and update refs
pull/2590/head
James Jackson-South 2 years ago
committed by GitHub
parent
commit
c5cc7a70fe
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs
  2. 12
      src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs
  3. 10
      src/ImageSharp/Processing/Processors/Quantization/QuantizerUtilities.cs
  4. 20
      src/ImageSharp/Processing/Processors/Quantization/WuQuantizer{TPixel}.cs
  5. 55
      tests/ImageSharp.Tests/Processing/Processors/Quantization/QuantizerTests.cs
  6. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_ErrorDither.png
  7. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_NoDither.png
  8. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_OrderedDither.png
  9. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_ErrorDither.png
  10. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_NoDither.png
  11. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_OrderedDither.png
  12. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_ErrorDither.png
  13. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_NoDither.png
  14. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_OrderedDither.png
  15. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_ErrorDither.png
  16. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_NoDither.png
  17. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_OrderedDither.png
  18. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_ErrorDither.png
  19. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_NoDither.png
  20. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_OrderedDither.png
  21. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_ErrorDither.png
  22. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_NoDither.png
  23. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_OrderedDither.png
  24. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_ErrorDither.png
  25. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_NoDither.png
  26. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_OrderedDither.png
  27. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_ErrorDither.png
  28. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_NoDither.png
  29. 4
      tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_OrderedDither.png

10
src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs

@ -60,7 +60,7 @@ public struct OctreeQuantizer<TPixel> : IQuantizer<TPixel>
public QuantizerOptions Options { get; } public QuantizerOptions Options { get; }
/// <inheritdoc/> /// <inheritdoc/>
public ReadOnlyMemory<TPixel> Palette public readonly ReadOnlyMemory<TPixel> Palette
{ {
get get
{ {
@ -72,16 +72,14 @@ public struct OctreeQuantizer<TPixel> : IQuantizer<TPixel>
/// <inheritdoc/> /// <inheritdoc/>
public void AddPaletteColors(Buffer2DRegion<TPixel> pixelRegion) public void AddPaletteColors(Buffer2DRegion<TPixel> pixelRegion)
{ {
Rectangle bounds = pixelRegion.Rectangle; using (IMemoryOwner<Rgba32> buffer = this.Configuration.MemoryAllocator.Allocate<Rgba32>(pixelRegion.Width))
Buffer2D<TPixel> source = pixelRegion.Buffer;
using (IMemoryOwner<Rgba32> buffer = this.Configuration.MemoryAllocator.Allocate<Rgba32>(bounds.Width))
{ {
Span<Rgba32> bufferSpan = buffer.GetSpan(); Span<Rgba32> bufferSpan = buffer.GetSpan();
// Loop through each row // Loop through each row
for (int y = bounds.Top; y < bounds.Bottom; y++) for (int y = 0; y < pixelRegion.Height; y++)
{ {
Span<TPixel> row = source.DangerousGetRowSpan(y).Slice(bounds.Left, bounds.Width); Span<TPixel> row = pixelRegion.DangerousGetRowSpan(y);
PixelOperations<TPixel>.Instance.ToRgba32(this.Configuration, row, bufferSpan); PixelOperations<TPixel>.Instance.ToRgba32(this.Configuration, row, bufferSpan);
for (int x = 0; x < bufferSpan.Length; x++) for (int x = 0; x < bufferSpan.Length; x++)

12
src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs

@ -32,7 +32,7 @@ internal class QuantizeProcessor<TPixel> : ImageProcessor<TPixel>
/// <inheritdoc /> /// <inheritdoc />
protected override void OnFrameApply(ImageFrame<TPixel> source) protected override void OnFrameApply(ImageFrame<TPixel> source)
{ {
var interest = Rectangle.Intersect(source.Bounds(), this.SourceRectangle); Rectangle interest = Rectangle.Intersect(source.Bounds(), this.SourceRectangle);
Configuration configuration = this.Configuration; Configuration configuration = this.Configuration;
using IQuantizer<TPixel> frameQuantizer = this.quantizer.CreatePixelSpecificQuantizer<TPixel>(configuration); using IQuantizer<TPixel> frameQuantizer = this.quantizer.CreatePixelSpecificQuantizer<TPixel>(configuration);
@ -43,14 +43,14 @@ internal class QuantizeProcessor<TPixel> : ImageProcessor<TPixel>
int offsetX = interest.Left; int offsetX = interest.Left;
Buffer2D<TPixel> sourceBuffer = source.PixelBuffer; Buffer2D<TPixel> sourceBuffer = source.PixelBuffer;
for (int y = interest.Y; y < interest.Height; y++) for (int y = 0; y < quantized.Height; y++)
{ {
Span<TPixel> row = sourceBuffer.DangerousGetRowSpan(y); ReadOnlySpan<byte> quantizedRow = quantized.DangerousGetRowSpan(y);
ReadOnlySpan<byte> quantizedRow = quantized.DangerousGetRowSpan(y - offsetY); Span<TPixel> row = sourceBuffer.DangerousGetRowSpan(y + offsetY);
for (int x = interest.Left; x < interest.Right; x++) for (int x = 0; x < quantized.Width; x++)
{ {
row[x] = paletteSpan[quantizedRow[x - offsetX]]; row[x + offsetX] = paletteSpan[quantizedRow[x]];
} }
} }
} }

10
src/ImageSharp/Processing/Processors/Quantization/QuantizerUtilities.cs

@ -154,14 +154,14 @@ public static class QuantizerUtilities
int offsetY = bounds.Top; int offsetY = bounds.Top;
int offsetX = bounds.Left; int offsetX = bounds.Left;
for (int y = bounds.Y; y < bounds.Height; y++) for (int y = 0; y < destination.Height; y++)
{ {
Span<TPixel> sourceRow = sourceBuffer.DangerousGetRowSpan(y); Span<TPixel> sourceRow = sourceBuffer.DangerousGetRowSpan(y + offsetY);
Span<byte> destinationRow = destination.GetWritablePixelRowSpanUnsafe(y - offsetY); Span<byte> destinationRow = destination.GetWritablePixelRowSpanUnsafe(y);
for (int x = bounds.Left; x < bounds.Right; x++) for (int x = 0; x < destination.Width; x++)
{ {
destinationRow[x - offsetX] = Unsafe.AsRef(quantizer).GetQuantizedColor(sourceRow[x], out TPixel _); destinationRow[x] = Unsafe.AsRef(quantizer).GetQuantizedColor(sourceRow[x + offsetX], out TPixel _);
} }
} }

20
src/ImageSharp/Processing/Processors/Quantization/WuQuantizer{TPixel}.cs

@ -123,10 +123,11 @@ internal struct WuQuantizer<TPixel> : IQuantizer<TPixel>
/// <inheritdoc/> /// <inheritdoc/>
public void AddPaletteColors(Buffer2DRegion<TPixel> pixelRegion) public void AddPaletteColors(Buffer2DRegion<TPixel> pixelRegion)
{ {
Rectangle bounds = pixelRegion.Rectangle; // TODO: Something is destroying the existing palette when adding new colors.
Buffer2D<TPixel> source = pixelRegion.Buffer; // When the QuantizingImageEncoder.PixelSamplingStrategy is DefaultPixelSamplingStrategy
// this leads to performance issues + the palette is not preserved.
this.Build3DHistogram(source, bounds); // https://github.com/SixLabors/ImageSharp/issues/2498
this.Build3DHistogram(pixelRegion);
this.Get3DMoments(this.memoryAllocator); this.Get3DMoments(this.memoryAllocator);
this.BuildCube(); this.BuildCube();
@ -360,19 +361,18 @@ internal struct WuQuantizer<TPixel> : IQuantizer<TPixel>
/// <summary> /// <summary>
/// Builds a 3-D color histogram of <c>counts, r/g/b, c^2</c>. /// Builds a 3-D color histogram of <c>counts, r/g/b, c^2</c>.
/// </summary> /// </summary>
/// <param name="source">The source data.</param> /// <param name="source">The source pixel data.</param>
/// <param name="bounds">The bounds within the source image to quantize.</param> private readonly void Build3DHistogram(Buffer2DRegion<TPixel> source)
private readonly void Build3DHistogram(Buffer2D<TPixel> source, Rectangle bounds)
{ {
Span<Moment> momentSpan = this.momentsOwner.GetSpan(); Span<Moment> momentSpan = this.momentsOwner.GetSpan();
// Build up the 3-D color histogram // Build up the 3-D color histogram
using IMemoryOwner<Rgba32> buffer = this.memoryAllocator.Allocate<Rgba32>(bounds.Width); using IMemoryOwner<Rgba32> buffer = this.memoryAllocator.Allocate<Rgba32>(source.Width);
Span<Rgba32> bufferSpan = buffer.GetSpan(); Span<Rgba32> bufferSpan = buffer.GetSpan();
for (int y = bounds.Top; y < bounds.Bottom; y++) for (int y = 0; y < source.Height; y++)
{ {
Span<TPixel> row = source.DangerousGetRowSpan(y).Slice(bounds.Left, bounds.Width); Span<TPixel> row = source.DangerousGetRowSpan(y);
PixelOperations<TPixel>.Instance.ToRgba32(this.Configuration, row, bufferSpan); PixelOperations<TPixel>.Instance.ToRgba32(this.Configuration, row, bufferSpan);
for (int x = 0; x < bufferSpan.Length; x++) for (int x = 0; x < bufferSpan.Length; x++)

55
tests/ImageSharp.Tests/Processing/Processors/Quantization/QuantizerTests.cs

@ -12,74 +12,66 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization;
[Trait("Category", "Processors")] [Trait("Category", "Processors")]
public class QuantizerTests public class QuantizerTests
{ {
/// <summary>
/// Something is causing tests to fail on NETFX in CI.
/// Could be a JIT error as everything runs well and is identical to .NET Core output.
/// Not worth investigating for now.
/// <see href="https://github.com/SixLabors/ImageSharp/pull/1114/checks?check_run_id=448891164#step:11:631"/>
/// </summary>
private static readonly bool SkipAllQuantizerTests = TestEnvironment.IsFramework;
public static readonly string[] CommonTestImages = public static readonly string[] CommonTestImages =
{ {
TestImages.Png.CalliphoraPartial, TestImages.Png.CalliphoraPartial,
TestImages.Png.Bike TestImages.Png.Bike
}; };
private static readonly QuantizerOptions NoDitherOptions = new QuantizerOptions { Dither = null }; private static readonly QuantizerOptions NoDitherOptions = new() { Dither = null };
private static readonly QuantizerOptions DiffuserDitherOptions = new QuantizerOptions { Dither = KnownDitherings.FloydSteinberg }; private static readonly QuantizerOptions DiffuserDitherOptions = new() { Dither = KnownDitherings.FloydSteinberg };
private static readonly QuantizerOptions OrderedDitherOptions = new QuantizerOptions { Dither = KnownDitherings.Bayer8x8 }; private static readonly QuantizerOptions OrderedDitherOptions = new() { Dither = KnownDitherings.Bayer8x8 };
private static readonly QuantizerOptions Diffuser0_ScaleDitherOptions = new QuantizerOptions private static readonly QuantizerOptions Diffuser0_ScaleDitherOptions = new()
{ {
Dither = KnownDitherings.FloydSteinberg, Dither = KnownDitherings.FloydSteinberg,
DitherScale = 0F DitherScale = 0F
}; };
private static readonly QuantizerOptions Diffuser0_25_ScaleDitherOptions = new QuantizerOptions private static readonly QuantizerOptions Diffuser0_25_ScaleDitherOptions = new()
{ {
Dither = KnownDitherings.FloydSteinberg, Dither = KnownDitherings.FloydSteinberg,
DitherScale = .25F DitherScale = .25F
}; };
private static readonly QuantizerOptions Diffuser0_5_ScaleDitherOptions = new QuantizerOptions private static readonly QuantizerOptions Diffuser0_5_ScaleDitherOptions = new()
{ {
Dither = KnownDitherings.FloydSteinberg, Dither = KnownDitherings.FloydSteinberg,
DitherScale = .5F DitherScale = .5F
}; };
private static readonly QuantizerOptions Diffuser0_75_ScaleDitherOptions = new QuantizerOptions private static readonly QuantizerOptions Diffuser0_75_ScaleDitherOptions = new()
{ {
Dither = KnownDitherings.FloydSteinberg, Dither = KnownDitherings.FloydSteinberg,
DitherScale = .75F DitherScale = .75F
}; };
private static readonly QuantizerOptions Ordered0_ScaleDitherOptions = new QuantizerOptions private static readonly QuantizerOptions Ordered0_ScaleDitherOptions = new()
{ {
Dither = KnownDitherings.Bayer8x8, Dither = KnownDitherings.Bayer8x8,
DitherScale = 0F DitherScale = 0F
}; };
private static readonly QuantizerOptions Ordered0_25_ScaleDitherOptions = new QuantizerOptions private static readonly QuantizerOptions Ordered0_25_ScaleDitherOptions = new()
{ {
Dither = KnownDitherings.Bayer8x8, Dither = KnownDitherings.Bayer8x8,
DitherScale = .25F DitherScale = .25F
}; };
private static readonly QuantizerOptions Ordered0_5_ScaleDitherOptions = new QuantizerOptions private static readonly QuantizerOptions Ordered0_5_ScaleDitherOptions = new()
{ {
Dither = KnownDitherings.Bayer8x8, Dither = KnownDitherings.Bayer8x8,
DitherScale = .5F DitherScale = .5F
}; };
private static readonly QuantizerOptions Ordered0_75_ScaleDitherOptions = new QuantizerOptions private static readonly QuantizerOptions Ordered0_75_ScaleDitherOptions = new()
{ {
Dither = KnownDitherings.Bayer8x8, Dither = KnownDitherings.Bayer8x8,
DitherScale = .75F DitherScale = .75F
}; };
public static readonly TheoryData<IQuantizer> Quantizers public static readonly TheoryData<IQuantizer> Quantizers
= new TheoryData<IQuantizer> = new()
{ {
// Known uses error diffusion by default. // Known uses error diffusion by default.
KnownQuantizers.Octree, KnownQuantizers.Octree,
@ -97,7 +89,7 @@ public class QuantizerTests
}; };
public static readonly TheoryData<IQuantizer> DitherScaleQuantizers public static readonly TheoryData<IQuantizer> DitherScaleQuantizers
= new TheoryData<IQuantizer> = new()
{ {
new OctreeQuantizer(Diffuser0_ScaleDitherOptions), new OctreeQuantizer(Diffuser0_ScaleDitherOptions),
new WebSafePaletteQuantizer(Diffuser0_ScaleDitherOptions), new WebSafePaletteQuantizer(Diffuser0_ScaleDitherOptions),
@ -151,7 +143,7 @@ public class QuantizerTests
}; };
public static readonly TheoryData<IDither> DefaultInstanceDitherers public static readonly TheoryData<IDither> DefaultInstanceDitherers
= new TheoryData<IDither> = new()
{ {
default(ErrorDither), default(ErrorDither),
default(OrderedDither) default(OrderedDither)
@ -164,11 +156,6 @@ public class QuantizerTests
public void ApplyQuantizationInBox<TPixel>(TestImageProvider<TPixel> provider, IQuantizer quantizer) public void ApplyQuantizationInBox<TPixel>(TestImageProvider<TPixel> provider, IQuantizer quantizer)
where TPixel : unmanaged, IPixel<TPixel> where TPixel : unmanaged, IPixel<TPixel>
{ {
if (SkipAllQuantizerTests)
{
return;
}
string quantizerName = quantizer.GetType().Name; string quantizerName = quantizer.GetType().Name;
string ditherName = quantizer.Options.Dither?.GetType()?.Name ?? "NoDither"; string ditherName = quantizer.Options.Dither?.GetType()?.Name ?? "NoDither";
string testOutputDetails = $"{quantizerName}_{ditherName}"; string testOutputDetails = $"{quantizerName}_{ditherName}";
@ -185,11 +172,6 @@ public class QuantizerTests
public void ApplyQuantization<TPixel>(TestImageProvider<TPixel> provider, IQuantizer quantizer) public void ApplyQuantization<TPixel>(TestImageProvider<TPixel> provider, IQuantizer quantizer)
where TPixel : unmanaged, IPixel<TPixel> where TPixel : unmanaged, IPixel<TPixel>
{ {
if (SkipAllQuantizerTests)
{
return;
}
string quantizerName = quantizer.GetType().Name; string quantizerName = quantizer.GetType().Name;
string ditherName = quantizer.Options.Dither?.GetType()?.Name ?? "NoDither"; string ditherName = quantizer.Options.Dither?.GetType()?.Name ?? "NoDither";
string testOutputDetails = $"{quantizerName}_{ditherName}"; string testOutputDetails = $"{quantizerName}_{ditherName}";
@ -206,11 +188,6 @@ public class QuantizerTests
public void ApplyQuantizationWithDitheringScale<TPixel>(TestImageProvider<TPixel> provider, IQuantizer quantizer) public void ApplyQuantizationWithDitheringScale<TPixel>(TestImageProvider<TPixel> provider, IQuantizer quantizer)
where TPixel : unmanaged, IPixel<TPixel> where TPixel : unmanaged, IPixel<TPixel>
{ {
if (SkipAllQuantizerTests)
{
return;
}
string quantizerName = quantizer.GetType().Name; string quantizerName = quantizer.GetType().Name;
string ditherName = quantizer.Options.Dither.GetType().Name; string ditherName = quantizer.Options.Dither.GetType().Name;
float ditherScale = quantizer.Options.DitherScale; float ditherScale = quantizer.Options.DitherScale;
@ -229,8 +206,8 @@ public class QuantizerTests
{ {
void Command() void Command()
{ {
using var image = new Image<Rgba32>(10, 10); using Image<Rgba32> image = new(10, 10);
var quantizer = new WebSafePaletteQuantizer(); WebSafePaletteQuantizer quantizer = new();
quantizer.Options.Dither = dither; quantizer.Options.Dither = dither;
image.Mutate(x => x.Quantize(quantizer)); image.Mutate(x => x.Quantize(quantizer));
} }

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:df15b095693880ec25f4fda378c8404a55064d83a40fc889f4e7ebb251dd88cf oid sha256:f4d36c8f7e5d5c0d798af5fb6bfad28ed0d628b880bea81efe0d54ac1fde86b2
size 272529 size 265268

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fd18f2ba17869695efda6acf7daa0f4def11a4f5ba6cee95e06cee505f076c77 oid sha256:9f165908729d723818b6c5843bd75298d987448e2cd4278dfe3f388a62025add
size 263994 size 238396

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_OctreeQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:7bcd315c4f140b55b294216de83f7835dcdf027acbd9cdb5e8bcbd89360c4781 oid sha256:34eaa0696da00838e591b2c48e7797641521f7f3feb01abbd774591c4dd6f200
size 272971 size 265546

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fb9b649fd0b217ce548d46b0e7958f5ab74b5862678d34839d7b7ab29e3722ee oid sha256:531594a2e47710545d96d0fd9a8cc86983233420172e0ced28df050df1a5e039
size 255871 size 239844

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c0374d786d726692e83022a5d8642807ad24f9d484393d564a4cc73a3f8971f8 oid sha256:4f1462733e02d499b0d8c61ab835a27c7fee560fdc7fc521d20ec09bb4ccc80f
size 250230 size 216030

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WebSafePaletteQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a8a9f1fab68b71ae87b7f8f8fa61cd73c6e868359bff60e91c1246eb04c92740 oid sha256:7e6d91a3ec4f974af675dc360fd5fd623ec8773cdbc88c0a3a6506880838718a
size 252981 size 226727

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:216d096da3a1e5df9cffa1dddc2c136c4ad0db1ca3ff930a46193352680e91d6 oid sha256:620463c14de12abb4f2cab3ee6259ad8cbb24c688212729535f41ebf492a8836
size 257442 size 224490

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:8c15a5b6114825ff1f118209831a89d8619ea2c956ad52f9564dfc41be94c6cb oid sha256:c68eba122814b5470e5f2e03e34190ff79e84e4b431ad8227355ce7ffcd4a6a7
size 255797 size 220192

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WernerPaletteQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:9694b6b29e33c5b0b5a8f662246f5ad0af03b900d52615fa61cad6d16cebb31c oid sha256:6dbd3189b559941f91dd6e0aa15b34a3e5081477400678c2396c6a66d398876f
size 259740 size 230883

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:cc776a1039f25212cbe983ae41de4bc3d8e53dd3f692c327da42d91fe983fe5d oid sha256:274c3e57f186c47bb070dfd2a79b8353032f9d91d03a3ab9ecb3aec13fdd9855
size 275846 size 273333

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:8aced00a35f19ccb7011cc7ef04bcbe79b064078a5b7b1649ecab789da13160e oid sha256:df63a3d12e2998d5242b64169ac86e3df7ab4be585a80daddc3e3888dfcb7095
size 273774 size 262298

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_Bike_WuQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f4fe9d03e33808cf97e6ee3a4a877160b04746e46a3e3c56c0cdf7ab617e90d9 oid sha256:457a0b4e27a09440ff4e13792b68fb5a9da82b7ce6129ea15a5ea8dcd99bd522
size 276397 size 274300

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:2358c7b0c3de1f13d9d7840108ffd1b65751946ba28a697d6ae48b7445541807 oid sha256:fd007786164af8f410bd9738c0a072fc75d1f9b50145e5c191c9e3df345341a5
size 308226 size 318778

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:38c112f9edef86df31b8ccec63bffdd3d4426eb5fd44b774bef4166c70f31a90 oid sha256:0203ecb9e4665e7c3992b7da4777c6d35b539790506fc9ca2acbcbc2bdb5db18
size 303086 size 303979

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_OctreeQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:93fd2a28153ec292c0d6b2651830566fa3ee0cdcad7f6978ff8b49cd7fb2ac27 oid sha256:62cdce27fc46a38a16995df8ed1501f65091d69315288479b1d613b1d87c8239
size 308104 size 321123

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:faf061e22dd0e34c62929e9e742c279f400293b87fca15e2e6423115b3e02862 oid sha256:08ace2edc5089a7742c1c8005126dcce850b1adf9c017b12db6892f4daeef1bb
size 290244 size 271721

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f9a368ff9fbb4d462a99b9eaab8e2ec81e4b1ae1d120cf5abc0cc5fe02ea941c oid sha256:3a2aae04edebcaca9b95f30963201794887fa0eac954b64c68bfe529b14fa9be
size 285759 size 269397

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WebSafePaletteQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:1926eec3a84dd8601ce0de5d8b1b70d25ebd120f4b9877b33266c18404a051fe oid sha256:2f3e9a338a5ae37c88ce0c348e0b655429220da051db3352779c277bb2dcb441
size 286469 size 270622

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:2c45b7993e7019efae493f738d6fd441446d9ff5fdf14200003a1a8a90d67b97 oid sha256:6ac7cdcc2fbee0572a369bed29c51e1c9056a4f09c4e0750ecb34d65daf403d4
size 292334 size 287741

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:94edf1b16733a2632406f70b61bcb4f95bc9044706f63b1840cede693330814d oid sha256:752760327cc1416c171a920f1e0e95e34eae6d78bd0c7393a3be427bf3c8e55c
size 291415 size 284481

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WernerPaletteQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:93ac2cc58c94e036287e76cda3970f070d15c4ded5dc2e553177772d327d56f6 oid sha256:293459538454e07bc9ea1e9df1fa5b0eb986fde7de42f6c25b43e4c8859bd28a
size 292742 size 285370

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_ErrorDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:307cd34267e96ca51d82873138e319830d13743c2085788ffcdec9bf60d45671 oid sha256:be7812accadc6347d6df43c308f7293596f92d0d90cf0b6a8e48fac1f4144fc0
size 310380 size 320157

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_NoDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a8c296a49104edbd0ccb237c0333d3ab403e8ad5cc15c91f1734d2c3d78cf135 oid sha256:ff094e6bafe81e818bcbac69018dcfe29366389dfca0d63d8e05ef42896ffe1d
size 309488 size 317309

4
tests/Images/External/ReferenceOutput/QuantizerTests/ApplyQuantizationInBox_CalliphoraPartial_WuQuantizer_OrderedDither.png

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:1874dab1b45fd976751395e1e9336ffb4d58e2e3d1643f48beea42f39245c98e oid sha256:ee0778aac671365dd0afae06cdcf8f36243bd9815f684b975f83e297bb694e63
size 311280 size 323979

Loading…
Cancel
Save