From d7b76c6c582b8de8c5eeac43fe13b94344ad393a Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Tue, 3 Nov 2015 17:08:42 +1100 Subject: [PATCH] Update all ColorMatrixFilters Former-commit-id: 81f83cc9f0f167fb3bde367bbd36fe9aa76504b0 Former-commit-id: 44d4145471664034876eb2afa05431a792ea0b78 Former-commit-id: 11968713a68322487ff287d8c30e039f0b83e302 --- .../Filters/ColorMatrix/BlackWhite.cs | 29 +- .../Filters/ColorMatrix/ColorMatrix.cs | 273 ------------------ .../Filters/ColorMatrix/ColorMatrixFilter.cs | 38 +-- .../Filters/ColorMatrix/GreyscaleBt601.cs | 2 +- .../Filters/ColorMatrix/GreyscaleBt709.cs | 2 +- .../Filters/ColorMatrix/Kodachrome.cs | 36 +++ .../Filters/ColorMatrix/Lomograph.cs | 14 +- .../Filters/ColorMatrix/MatrixFilter.cs | 77 ----- .../Filters/ColorMatrix/Polaroid.cs | 28 +- .../Filters/ColorMatrix/Sepia.cs | 2 +- src/ImageProcessor/ImageProcessor.csproj | 5 +- .../project.lock.json.REMOVED.git-id | 2 +- .../Processors/Filters/FilterTests.cs | 3 +- .../Processors/ProcessorTestBase.cs | 2 + .../TestImages/Formats/Jpg/lomo.jpg | Bin 0 -> 45508 bytes .../Jpg/shaftesbury.jpg.REMOVED.git-id | 1 + 16 files changed, 97 insertions(+), 417 deletions(-) delete mode 100644 src/ImageProcessor/Filters/ColorMatrix/ColorMatrix.cs create mode 100644 src/ImageProcessor/Filters/ColorMatrix/Kodachrome.cs delete mode 100644 src/ImageProcessor/Filters/ColorMatrix/MatrixFilter.cs create mode 100644 tests/ImageProcessor.Tests/TestImages/Formats/Jpg/lomo.jpg create mode 100644 tests/ImageProcessor.Tests/TestImages/Formats/Jpg/shaftesbury.jpg.REMOVED.git-id diff --git a/src/ImageProcessor/Filters/ColorMatrix/BlackWhite.cs b/src/ImageProcessor/Filters/ColorMatrix/BlackWhite.cs index 153e84de62..e1fc20b70d 100644 --- a/src/ImageProcessor/Filters/ColorMatrix/BlackWhite.cs +++ b/src/ImageProcessor/Filters/ColorMatrix/BlackWhite.cs @@ -5,6 +5,8 @@ namespace ImageProcessor.Filters { + using System.Numerics; + /// /// Converts the colors of the image to their black and white equivalent. /// @@ -12,23 +14,28 @@ namespace ImageProcessor.Filters { /// /// The BlackWhite matrix. - /// TODO: Calculate a matrix that works in the linear color space. /// - private static readonly ColorMatrix Matrix = new ColorMatrix( - new[] - { - new[] { 1.5f, 1.5f, 1.5f, 0, 0 }, - new[] { 1.5f, 1.5f, 1.5f, 0, 0 }, - new[] { 1.5f, 1.5f, 1.5f, 0, 0 }, - new float[] { 0, 0, 0, 1, 0 }, - new float[] { -1, -1, -1, 0, 1 } - }); + private static readonly Matrix4x4 Matrix = new Matrix4x4() + { + M11 = 1.5f, + M12 = 1.5f, + M13 = 1.5f, + M21 = 1.5f, + M22 = 1.5f, + M23 = 1.5f, + M31 = 1.5f, + M32 = 1.5f, + M33 = 1.5f, + M41 = -1f, + M42 = -1f, + M43 = -1f, + }; /// /// Initializes a new instance of the class. /// public BlackWhite() - : base(Matrix, false) + : base(Matrix) { } } diff --git a/src/ImageProcessor/Filters/ColorMatrix/ColorMatrix.cs b/src/ImageProcessor/Filters/ColorMatrix/ColorMatrix.cs deleted file mode 100644 index 0cab8e1ef6..0000000000 --- a/src/ImageProcessor/Filters/ColorMatrix/ColorMatrix.cs +++ /dev/null @@ -1,273 +0,0 @@ -// -------------------------------------------------------------------------------------------------------------------- -// -// Copyright (c) James South and contributors. -// Licensed under the Apache License, Version 2.0. -// -// -------------------------------------------------------------------------------------------------------------------- - -namespace ImageProcessor.Filters -{ - /// - /// Defines a 5x5 matrix that contains the coordinates for the RGBAW color space. - /// - public sealed class ColorMatrix - { - /// - /// Initializes a new instance of the class. - /// - public ColorMatrix() - { - // Setup the identity matrix by default - this.Matrix00 = 1.0f; - this.Matrix11 = 1.0f; - this.Matrix22 = 1.0f; - this.Matrix33 = 1.0f; - this.Matrix44 = 1.0f; - } - - /// - /// Initializes a new instance of the class with the - /// elements in the specified matrix. - /// - /// - /// The elements defining the new Color Matrix. - /// - public ColorMatrix(float[][] colorMatrix) - { - this.SetMatrix(colorMatrix); - } - - /// - /// Gets or sets the element at the 0th row and 0th column of this . - /// - public float Matrix00 { get; set; } - - /// - /// Gets or sets the element at the 0th row and 1st column of this . - /// - public float Matrix01 { get; set; } - - /// - /// Gets or sets the element at the 0th row and 2nd column of this . - /// - public float Matrix02 { get; set; } - - /// - /// Gets or sets the element at the 0th row and 3rd column of this . - /// - public float Matrix03 { get; set; } - - /// - /// Gets or sets the element at the 0th row and 4th column of this . - /// - public float Matrix04 { get; set; } - - /// - /// Gets or sets the element at the 1st row and 0th column of this . - /// - public float Matrix10 { get; set; } - - /// - /// Gets or sets the element at the 1st row and 1st column of this . - /// - public float Matrix11 { get; set; } - - /// - /// Gets or sets the element at the 1st row and 2nd column of this . - /// - public float Matrix12 { get; set; } - - /// - /// Gets or sets the element at the 1st row and 3rd column of this . - /// - public float Matrix13 { get; set; } - - /// - /// Gets or sets the element at the 1st row and 4th column of this . - /// - public float Matrix14 { get; set; } - - /// - /// Gets or sets the element at the 2nd row and 0th column of this . - /// - public float Matrix20 { get; set; } - - /// - /// Gets or sets the element at the 2nd row and 1st column of this . - /// - public float Matrix21 { get; set; } - - /// - /// Gets or sets the element at the 2nd row and 2nd column of this . - /// - public float Matrix22 { get; set; } - - /// - /// Gets or sets the element at the 2nd row and 3rd column of this . - /// - public float Matrix23 { get; set; } - - /// - /// Gets or sets the element at the 2nd row and 4th column of this . - /// - public float Matrix24 { get; set; } - - /// - /// Gets or sets the element at the 3rd row and 0th column of this . - /// - public float Matrix30 { get; set; } - - /// - /// Gets or sets the element at the 3rd row and 1st column of this . - /// - public float Matrix31 { get; set; } - - /// - /// Gets or sets the element at the 3rd row and 2nd column of this . - /// - public float Matrix32 { get; set; } - - /// - /// Gets or sets the element at the 3rd row and 3rd column of this . - /// - public float Matrix33 { get; set; } - - /// - /// Gets or sets the element at the 3rd row and 4th column of this . - /// - public float Matrix34 { get; set; } - - /// - /// Gets or sets the element at the 4th row and 0th column of this . - /// - public float Matrix40 { get; set; } - - /// - /// Gets or sets the element at the 4th row and 1st column of this . - /// - public float Matrix41 { get; set; } - - /// - /// Gets or sets the element at the 4th row and 2nd column of this . - /// - public float Matrix42 { get; set; } - - /// - /// Gets or sets the element at the 4th row and 3rd column of this . - /// - public float Matrix43 { get; set; } - - /// - /// Gets or sets the element at the 4th row and 4th column of this . - /// - public float Matrix44 { get; set; } - - /// - /// Gets or sets the value of the specified element of this . - /// - /// - /// The row index. - /// - /// - /// The column index. - /// - /// - /// The . - /// - public float this[int row, int column] - { - get - { - return this.GetMatrix()[row][column]; - } - - set - { - float[][] tempMatrix = this.GetMatrix(); - - tempMatrix[row][column] = value; - - this.SetMatrix(tempMatrix); - } - } - - /// - /// Sets the values of this to the values contained within the elements. - /// - /// - /// The new color matrix. - /// - internal void SetMatrix(float[][] colorMatrix) - { - this.Matrix00 = colorMatrix[0][0]; - this.Matrix01 = colorMatrix[0][1]; - this.Matrix02 = colorMatrix[0][2]; - this.Matrix03 = colorMatrix[0][3]; - this.Matrix04 = colorMatrix[0][4]; - this.Matrix10 = colorMatrix[1][0]; - this.Matrix11 = colorMatrix[1][1]; - this.Matrix12 = colorMatrix[1][2]; - this.Matrix13 = colorMatrix[1][3]; - this.Matrix14 = colorMatrix[1][4]; - this.Matrix20 = colorMatrix[2][0]; - this.Matrix21 = colorMatrix[2][1]; - this.Matrix22 = colorMatrix[2][2]; - this.Matrix23 = colorMatrix[2][3]; - this.Matrix24 = colorMatrix[2][4]; - this.Matrix30 = colorMatrix[3][0]; - this.Matrix31 = colorMatrix[3][1]; - this.Matrix32 = colorMatrix[3][2]; - this.Matrix33 = colorMatrix[3][3]; - this.Matrix34 = colorMatrix[3][4]; - this.Matrix40 = colorMatrix[4][0]; - this.Matrix41 = colorMatrix[4][1]; - this.Matrix42 = colorMatrix[4][2]; - this.Matrix43 = colorMatrix[4][3]; - this.Matrix44 = colorMatrix[4][4]; - } - - /// - /// Gets this . - /// - /// - /// The . - /// - internal float[][] GetMatrix() - { - float[][] returnMatrix = new float[5][]; - - for (int i = 0; i < 5; i++) - { - returnMatrix[i] = new float[5]; - } - - returnMatrix[0][0] = this.Matrix00; - returnMatrix[0][1] = this.Matrix01; - returnMatrix[0][2] = this.Matrix02; - returnMatrix[0][3] = this.Matrix03; - returnMatrix[0][4] = this.Matrix04; - returnMatrix[1][0] = this.Matrix10; - returnMatrix[1][1] = this.Matrix11; - returnMatrix[1][2] = this.Matrix12; - returnMatrix[1][3] = this.Matrix13; - returnMatrix[1][4] = this.Matrix14; - returnMatrix[2][0] = this.Matrix20; - returnMatrix[2][1] = this.Matrix21; - returnMatrix[2][2] = this.Matrix22; - returnMatrix[2][3] = this.Matrix23; - returnMatrix[2][4] = this.Matrix24; - returnMatrix[3][0] = this.Matrix30; - returnMatrix[3][1] = this.Matrix31; - returnMatrix[3][2] = this.Matrix32; - returnMatrix[3][3] = this.Matrix33; - returnMatrix[3][4] = this.Matrix34; - returnMatrix[4][0] = this.Matrix40; - returnMatrix[4][1] = this.Matrix41; - returnMatrix[4][2] = this.Matrix42; - returnMatrix[4][3] = this.Matrix43; - returnMatrix[4][4] = this.Matrix44; - - return returnMatrix; - } - } -} diff --git a/src/ImageProcessor/Filters/ColorMatrix/ColorMatrixFilter.cs b/src/ImageProcessor/Filters/ColorMatrix/ColorMatrixFilter.cs index 17a49b8fb7..8c58bc78b9 100644 --- a/src/ImageProcessor/Filters/ColorMatrix/ColorMatrixFilter.cs +++ b/src/ImageProcessor/Filters/ColorMatrix/ColorMatrixFilter.cs @@ -5,6 +5,7 @@ namespace ImageProcessor.Filters { + using System.Numerics; using System.Threading.Tasks; /// @@ -15,33 +16,25 @@ namespace ImageProcessor.Filters /// /// Initializes a new instance of the class. /// - /// The matrix to apply. - /// Whether to gamma adjust the colors before applying the matrix. - public ColorMatrixFilter(ColorMatrix matrix, bool gammaAdjust) + /// The to apply. + public ColorMatrixFilter(Matrix4x4 matrix) { this.Value = matrix; - this.GammaAdjust = gammaAdjust; } /// /// Gets the matrix value. /// - public ColorMatrix Value { get; } - - /// - /// Gets a value indicating whether to gamma adjust the colors before applying the matrix. - /// - public bool GammaAdjust { get; } + public Matrix4x4 Value { get; } /// protected override void Apply(ImageBase target, ImageBase source, Rectangle targetRectangle, Rectangle sourceRectangle, int startY, int endY) { - bool gamma = this.GammaAdjust; int sourceY = sourceRectangle.Y; int sourceBottom = sourceRectangle.Bottom; int startX = sourceRectangle.X; int endX = sourceRectangle.Right; - ColorMatrix matrix = this.Value; + Matrix4x4 matrix = this.Value; Parallel.For( startY, @@ -52,7 +45,7 @@ namespace ImageProcessor.Filters { for (int x = startX; x < endX; x++) { - target[x, y] = ApplyMatrix(source[x, y], matrix, gamma); + target[x, y] = ApplyMatrix(source[x, y], matrix); } } }); @@ -63,29 +56,22 @@ namespace ImageProcessor.Filters /// /// The source color. /// The matrix. - /// Whether to perform gamma adjustments. /// /// The . /// - private static Color ApplyMatrix(Color color, ColorMatrix matrix, bool gamma) + private static Color ApplyMatrix(Color color, Matrix4x4 matrix) { - if (gamma) - { - color = PixelOperations.ToLinear(color); - } + color = PixelOperations.ToLinear(color); float sr = color.R; float sg = color.G; float sb = color.B; - float sa = color.A; - // TODO: Investigate RGBAW - color.R = (sr * matrix.Matrix00) + (sg * matrix.Matrix10) + (sb * matrix.Matrix20) + (sa * matrix.Matrix30) + matrix.Matrix40; - color.G = (sr * matrix.Matrix01) + (sg * matrix.Matrix11) + (sb * matrix.Matrix21) + (sa * matrix.Matrix31) + matrix.Matrix41; - color.B = (sr * matrix.Matrix02) + (sg * matrix.Matrix12) + (sb * matrix.Matrix22) + (sa * matrix.Matrix32) + matrix.Matrix42; - color.A = (sr * matrix.Matrix03) + (sg * matrix.Matrix13) + (sb * matrix.Matrix23) + (sa * matrix.Matrix33) + matrix.Matrix43; + color.R = (sr * matrix.M11) + (sg * matrix.M21) + (sb * matrix.M31) + matrix.M41; + color.G = (sr * matrix.M12) + (sg * matrix.M22) + (sb * matrix.M32) + matrix.M42; + color.B = (sr * matrix.M13) + (sg * matrix.M23) + (sb * matrix.M33) + matrix.M43; - return gamma ? PixelOperations.ToSrgb(color) : color; + return PixelOperations.ToSrgb(color); } } } diff --git a/src/ImageProcessor/Filters/ColorMatrix/GreyscaleBt601.cs b/src/ImageProcessor/Filters/ColorMatrix/GreyscaleBt601.cs index d10264c932..7c9a6b7d98 100644 --- a/src/ImageProcessor/Filters/ColorMatrix/GreyscaleBt601.cs +++ b/src/ImageProcessor/Filters/ColorMatrix/GreyscaleBt601.cs @@ -11,7 +11,7 @@ namespace ImageProcessor.Filters /// Converts the colors of the image to greyscale applying the formula as specified by /// ITU-R Recommendation BT.601 . /// - public class GreyscaleBt601 : MatrixFilter + public class GreyscaleBt601 : ColorMatrixFilter { /// /// The greyscale matrix. diff --git a/src/ImageProcessor/Filters/ColorMatrix/GreyscaleBt709.cs b/src/ImageProcessor/Filters/ColorMatrix/GreyscaleBt709.cs index 8f59be7a24..b2f1834c7e 100644 --- a/src/ImageProcessor/Filters/ColorMatrix/GreyscaleBt709.cs +++ b/src/ImageProcessor/Filters/ColorMatrix/GreyscaleBt709.cs @@ -11,7 +11,7 @@ namespace ImageProcessor.Filters /// Converts the colors of the image to greyscale applying the formula as specified by /// ITU-R Recommendation BT.709 . /// - public class GreyscaleBt709 : MatrixFilter + public class GreyscaleBt709 : ColorMatrixFilter { /// /// The greyscale matrix. diff --git a/src/ImageProcessor/Filters/ColorMatrix/Kodachrome.cs b/src/ImageProcessor/Filters/ColorMatrix/Kodachrome.cs new file mode 100644 index 0000000000..4468ec70e1 --- /dev/null +++ b/src/ImageProcessor/Filters/ColorMatrix/Kodachrome.cs @@ -0,0 +1,36 @@ +// +// Copyright (c) James South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageProcessor.Filters +{ + using System.Numerics; + + /// + /// Converts the colors of the image recreating an old Kodachrome camera effect. + /// + public class Kodachrome : ColorMatrixFilter + { + /// + /// The Kodachrome matrix. Purely artistic in composition. + /// + private static readonly Matrix4x4 Matrix = new Matrix4x4() + { + M11 = 0.6997023f, + M22 = 0.4609577f, + M33 = 0.397218f, + M41 = 0.005f, + M42 = -0.005f, + M43 = 0.005f + }; + + /// + /// Initializes a new instance of the class. + /// + public Kodachrome() + : base(Matrix) + { + } + } +} diff --git a/src/ImageProcessor/Filters/ColorMatrix/Lomograph.cs b/src/ImageProcessor/Filters/ColorMatrix/Lomograph.cs index 895a9f2f91..870c0d4a2f 100644 --- a/src/ImageProcessor/Filters/ColorMatrix/Lomograph.cs +++ b/src/ImageProcessor/Filters/ColorMatrix/Lomograph.cs @@ -10,30 +10,20 @@ namespace ImageProcessor.Filters /// /// Converts the colors of the image recreating an old Lomograph effect. /// - public class Lomograph : MatrixFilter + public class Lomograph : ColorMatrixFilter { /// /// The Lomograph matrix. Purely artistic in composition. - /// TODO: Calculate a matrix that works in the linear color space. /// private static readonly Matrix4x4 Matrix = new Matrix4x4() { M11 = 1.5f, M22 = 1.45f, - M33 = 1.09f, + M33 = 1.11f, M41 = -.1f, M42 = .0f, M43 = -.08f }; - //private static readonly ColorMatrix Matrix = new ColorMatrix( - // new[] - // { - // new[] { 1.50f, 0, 0, 0, 0 }, - // new[] { 0, 1.45f, 0, 0, 0 }, - // new[] { 0, 0, 1.09f, 0, 0 }, - // new float[] { 0, 0, 0, 1, 0 }, - // new[] { -0.10f, 0.05f, -0.08f, 0, 1 } - // }); /// /// Initializes a new instance of the class. diff --git a/src/ImageProcessor/Filters/ColorMatrix/MatrixFilter.cs b/src/ImageProcessor/Filters/ColorMatrix/MatrixFilter.cs deleted file mode 100644 index 2306af112d..0000000000 --- a/src/ImageProcessor/Filters/ColorMatrix/MatrixFilter.cs +++ /dev/null @@ -1,77 +0,0 @@ -// -// Copyright (c) James South and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace ImageProcessor.Filters -{ - using System.Numerics; - using System.Threading.Tasks; - - /// - /// The color matrix filter. - /// - public class MatrixFilter : ParallelImageProcessor - { - /// - /// Initializes a new instance of the class. - /// - /// The to apply. - public MatrixFilter(Matrix4x4 matrix) - { - this.Value = matrix; - } - - /// - /// Gets the matrix value. - /// - public Matrix4x4 Value { get; } - - /// - protected override void Apply(ImageBase target, ImageBase source, Rectangle targetRectangle, Rectangle sourceRectangle, int startY, int endY) - { - int sourceY = sourceRectangle.Y; - int sourceBottom = sourceRectangle.Bottom; - int startX = sourceRectangle.X; - int endX = sourceRectangle.Right; - Matrix4x4 matrix = this.Value; - - Parallel.For( - startY, - endY, - y => - { - if (y >= sourceY && y < sourceBottom) - { - for (int x = startX; x < endX; x++) - { - target[x, y] = ApplyMatrix(source[x, y], matrix); - } - } - }); - } - - /// - /// Applies the color matrix against the given color. - /// - /// The source color. - /// The matrix. - /// - /// The . - /// - private static Color ApplyMatrix(Color color, Matrix4x4 matrix) - { - color = PixelOperations.ToLinear(color); - - float sr = color.R; - float sg = color.G; - float sb = color.B; - - color.R = (sr * matrix.M11) + (sg * matrix.M21) + (sb * matrix.M31) + matrix.M41; - color.G = (sr * matrix.M12) + (sg * matrix.M22) + (sb * matrix.M32) + matrix.M42; - color.B = (sr * matrix.M13) + (sg * matrix.M23) + (sb * matrix.M33) + matrix.M43; - - return PixelOperations.ToSrgb(color); - } - } -} diff --git a/src/ImageProcessor/Filters/ColorMatrix/Polaroid.cs b/src/ImageProcessor/Filters/ColorMatrix/Polaroid.cs index 2b6b9289d4..875b44b7d1 100644 --- a/src/ImageProcessor/Filters/ColorMatrix/Polaroid.cs +++ b/src/ImageProcessor/Filters/ColorMatrix/Polaroid.cs @@ -5,6 +5,8 @@ namespace ImageProcessor.Filters { + using System.Numerics; + /// /// Converts the colors of the image recreating an old Polaroid effect. /// @@ -14,21 +16,27 @@ namespace ImageProcessor.Filters /// The Polaroid matrix. Purely artistic in composition. /// TODO: Calculate a matrix that works in the linear color space. /// - private static readonly ColorMatrix Matrix = new ColorMatrix( - new[] - { - new[] { 1.638f, -0.062f, -0.262f, 0, 0 }, - new[] { -0.122f, 1.378f, -0.122f, 0, 0 }, - new[] { 1.016f, -0.016f, 1.383f, 0, 0 }, - new float[] { 0, 0, 0, 1, 0 }, - new[] { 0.06f, -0.05f, -0.05f, 0, 1 } - }); + private static readonly Matrix4x4 Matrix = new Matrix4x4() + { + M11 = 1.538f, + M12 = -0.062f, + M13 = -0.262f, + M21 = -0.022f, + M22 = 1.578f, + M23 = -0.022f, + M31 = .616f, + M32 = -.16f, + M33 = 1.5831f, + M41 = 0.02f, + M42 = -0.05f, + M43 = -0.05f + }; /// /// Initializes a new instance of the class. /// public Polaroid() - : base(Matrix, false) + : base(Matrix) { } } diff --git a/src/ImageProcessor/Filters/ColorMatrix/Sepia.cs b/src/ImageProcessor/Filters/ColorMatrix/Sepia.cs index 8628b8e817..73cc4b312f 100644 --- a/src/ImageProcessor/Filters/ColorMatrix/Sepia.cs +++ b/src/ImageProcessor/Filters/ColorMatrix/Sepia.cs @@ -10,7 +10,7 @@ namespace ImageProcessor.Filters /// /// Converts the colors of the image to their sepia equivalent recreating an old photo effect. /// - public class Sepia : MatrixFilter + public class Sepia : ColorMatrixFilter { /// /// The sepia matrix. diff --git a/src/ImageProcessor/ImageProcessor.csproj b/src/ImageProcessor/ImageProcessor.csproj index 48cd59e1d3..4c5c260d8d 100644 --- a/src/ImageProcessor/ImageProcessor.csproj +++ b/src/ImageProcessor/ImageProcessor.csproj @@ -48,14 +48,13 @@ - + + - - diff --git a/src/ImageProcessor/project.lock.json.REMOVED.git-id b/src/ImageProcessor/project.lock.json.REMOVED.git-id index 24339fed21..dba2656f57 100644 --- a/src/ImageProcessor/project.lock.json.REMOVED.git-id +++ b/src/ImageProcessor/project.lock.json.REMOVED.git-id @@ -1 +1 @@ -3f05708641eb3ed085d4689aae4a960eb067fd16 \ No newline at end of file +eb00c54ee74016c2b70f81963e7e8f83cb2dd54b \ No newline at end of file diff --git a/tests/ImageProcessor.Tests/Processors/Filters/FilterTests.cs b/tests/ImageProcessor.Tests/Processors/Filters/FilterTests.cs index dfda1ef794..810a872fdc 100644 --- a/tests/ImageProcessor.Tests/Processors/Filters/FilterTests.cs +++ b/tests/ImageProcessor.Tests/Processors/Filters/FilterTests.cs @@ -22,8 +22,9 @@ namespace ImageProcessor.Tests //{ "Invert", new Invert() }, //{ "Sepia", new Sepia() }, //{ "BlackWhite", new BlackWhite() }, - { "Lomograph", new Lomograph() }, + //{ "Lomograph", new Lomograph() }, //{ "Polaroid", new Polaroid() }, + { "Brownie", new Kodachrome() }, //{ "GreyscaleBt709", new GreyscaleBt709() }, //{ "GreyscaleBt601", new GreyscaleBt601() }, }; diff --git a/tests/ImageProcessor.Tests/Processors/ProcessorTestBase.cs b/tests/ImageProcessor.Tests/Processors/ProcessorTestBase.cs index 6c33ef4c47..d7580defb0 100644 --- a/tests/ImageProcessor.Tests/Processors/ProcessorTestBase.cs +++ b/tests/ImageProcessor.Tests/Processors/ProcessorTestBase.cs @@ -21,6 +21,8 @@ namespace ImageProcessor.Tests { //"../../TestImages/Formats/Jpg/Backdrop.jpg", "../../TestImages/Formats/Jpg/Calliphora.jpg", + "../../TestImages/Formats/Jpg/lomo.jpg", + "../../TestImages/Formats/Jpg/shaftesbury.jpg", //"../../TestImages/Formats/Jpg/gamma_dalai_lama_gray.jpg", //"../../TestImages/Formats/Jpg/greyscale.jpg", //"../../TestImages/Formats/Bmp/Car.bmp", diff --git a/tests/ImageProcessor.Tests/TestImages/Formats/Jpg/lomo.jpg b/tests/ImageProcessor.Tests/TestImages/Formats/Jpg/lomo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3995b79042a0593346dea54e8707b93b02b7133e GIT binary patch literal 45508 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%0D$RGVb5(hu)O3vZJq8-{rdPkT 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 R+zu$_>*@Iz*3mDS|JfOV$^8HT literal 0 HcmV?d00001 diff --git a/tests/ImageProcessor.Tests/TestImages/Formats/Jpg/shaftesbury.jpg.REMOVED.git-id b/tests/ImageProcessor.Tests/TestImages/Formats/Jpg/shaftesbury.jpg.REMOVED.git-id new file mode 100644 index 0000000000..59372951be --- /dev/null +++ b/tests/ImageProcessor.Tests/TestImages/Formats/Jpg/shaftesbury.jpg.REMOVED.git-id @@ -0,0 +1 @@ +2eabac96326130ba423b3fecb5a163b734278370 \ No newline at end of file