Browse Source

Use premultiply for resize. Fix #428

pull/446/head
James Jackson-South 8 years ago
parent
commit
219fdbd36b
  1. 4
      src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor.cs
  2. 4
      src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor.cs
  3. 8
      src/ImageSharp/Processing/Processors/Transforms/WeightsWindow.cs
  4. 11
      tests/ImageSharp.Tests/Processing/Processors/Convolution/DetectEdgesTest.cs
  5. 2
      tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs

4
src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor.cs

@ -204,7 +204,7 @@ namespace SixLabors.ImageSharp.Processing.Processors
var vector = source[i, j].ToVector4();
// Values are first premultiplied to prevent darkening of edge pixels
var mupltiplied = new Vector4(new Vector3(vector.X, vector.Y, vector.Z) * vector.W, vector.W);
Vector4 mupltiplied = vector.Premultiply();
sum += mupltiplied * xWeight * yWeight;
}
}
@ -212,7 +212,7 @@ namespace SixLabors.ImageSharp.Processing.Processors
ref TPixel dest = ref destRow[x];
// Reverse the premultiplication
dest.PackFromVector4(new Vector4(new Vector3(sum.X, sum.Y, sum.Z) / sum.W, sum.W));
dest.PackFromVector4(sum.UnPremultiply());
}
});
}

4
src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor.cs

@ -199,7 +199,7 @@ namespace SixLabors.ImageSharp.Processing.Processors
var vector = source[i, j].ToVector4();
// Values are first premultiplied to prevent darkening of edge pixels
var mupltiplied = new Vector4(new Vector3(vector.X, vector.Y, vector.Z) * vector.W, vector.W);
Vector4 mupltiplied = vector.Premultiply();
sum += mupltiplied * xWeight * yWeight;
}
}
@ -207,7 +207,7 @@ namespace SixLabors.ImageSharp.Processing.Processors
ref TPixel dest = ref destRow[x];
// Reverse the premultiplication
dest.PackFromVector4(new Vector4(new Vector3(sum.X, sum.Y, sum.Z) / sum.W, sum.W));
dest.PackFromVector4(sum.UnPremultiply());
}
});
}

8
src/ImageSharp/Processing/Processors/Transforms/WeightsWindow.cs

@ -87,7 +87,7 @@ namespace SixLabors.ImageSharp.Processing.Processors
{
float weight = Unsafe.Add(ref horizontalValues, i);
Vector4 v = Unsafe.Add(ref vecPtr, i);
result += v * weight;
result += v.Premultiply() * weight;
}
return result;
@ -114,10 +114,10 @@ namespace SixLabors.ImageSharp.Processing.Processors
{
float weight = Unsafe.Add(ref horizontalValues, i);
Vector4 v = Unsafe.Add(ref vecPtr, i);
result += v.Expand() * weight;
result += v.Premultiply().Expand() * weight;
}
return result;
return result.UnPremultiply();
}
/// <summary>
@ -144,7 +144,7 @@ namespace SixLabors.ImageSharp.Processing.Processors
result += firstPassPixels[x, index] * yw;
}
return result;
return result.UnPremultiply();
}
}
}

11
tests/ImageSharp.Tests/Processing/Processors/Convolution/DetectEdgesTest.cs

@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Convolution
public class DetectEdgesTest : FileTestBase
{
public static readonly string[] CommonTestImages = { TestImages.Png.Bike };
public static readonly TheoryData<EdgeDetection> DetectEdgesFilters = new TheoryData<EdgeDetection>
{
EdgeDetection.Kayyali,
@ -54,9 +54,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Convolution
{
image.Mutate(x => x.DetectEdges());
image.DebugSave(provider);
// TODO: Enable once we have updated the images
// image.CompareToReferenceOutput(provider);
image.CompareToReferenceOutput(provider);
}
}
@ -85,10 +83,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Convolution
image.DebugSave(provider);
// TODO: Enable once we have updated the images
//image.CompareToReferenceOutput(provider);
// TODO: We don't need this any longer after switching to ReferenceImages
//ImageComparer.Tolerant().EnsureProcessorChangesAreConstrained(source, image, bounds);
image.CompareToReferenceOutput(provider);
}
}
}

2
tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs

@ -89,7 +89,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms
{
using (Image<TPixel> image = provider.GetImage())
{
image.Mutate(x => x.Resize(image.Width / 2, image.Height / 2, true));
image.Mutate(x => x.Resize(image.Width / 2, image.Height / 2, KnownResamplers.NearestNeighbor));
// Comparer fights decoder with gif-s. Could not use CompareToReferenceOutput here :(
image.DebugSave(provider, extension: Extensions.Gif);

Loading…
Cancel
Save