Browse Source

Use compand and inverse.

Former-commit-id: d767103ac110d527e2d62c4582f25d5fbc382795
Former-commit-id: d6c8f8645138596b21a29206bb94426ca2913392
Former-commit-id: b78498a1668f0f302ce829365675ba9cac8b81c2
af/merge-core
James Jackson-South 11 years ago
parent
commit
8ce6458ab4
  1. 1
      src/ImageProcessor/Colors/Color.cs
  2. 92
      src/ImageProcessor/Common/Helpers/PixelOperations.cs
  3. 4
      src/ImageProcessor/Filters/Brightness.cs
  4. 4
      src/ImageProcessor/Filters/ColorMatrix/ColorMatrixFilter.cs
  5. 4
      src/ImageProcessor/Filters/Contrast.cs
  6. 1
      src/ImageProcessor/ImageProcessor.csproj
  7. 6
      src/ImageProcessor/Samplers/Resize.cs
  8. 2
      src/ImageProcessor/project.lock.json.REMOVED.git-id

1
src/ImageProcessor/Colors/Color.cs

@ -8,6 +8,7 @@ namespace ImageProcessor
using System; using System;
using System.ComponentModel; using System.ComponentModel;
using System.Numerics; using System.Numerics;
using System.Runtime.CompilerServices;
/// <summary> /// <summary>
/// Represents a four-component color using red, green, blue, and alpha data. /// Represents a four-component color using red, green, blue, and alpha data.

92
src/ImageProcessor/Common/Helpers/PixelOperations.cs

@ -1,92 +0,0 @@
// <copyright file="PixelOperations.cs" company="James South">
// Copyright (c) James South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessor
{
using System;
using System.Numerics;
/// <summary>
/// Performs per-pixel operations.
/// </summary>
public static class PixelOperations
{
/// <summary>
/// Converts an pixel from an sRGB color-space to the equivalent linear color-space.
/// </summary>
/// <param name="composite">
/// The <see cref="Bgra32"/> to convert.
/// </param>
/// <returns>
/// The <see cref="Bgra32"/>.
/// </returns>
public static Color ToLinear(Color composite)
{
// TODO: Figure out a way to either cache these values quickly or perform the calcuations together.
composite.R = SrgbToLinear(composite.R);
composite.G = SrgbToLinear(composite.G);
composite.B = SrgbToLinear(composite.B);
return composite;
}
/// <summary>
/// Converts a pixel from a linear color-space to the equivalent sRGB color-space.
/// </summary>
/// <param name="linear">
/// The <see cref="Bgra32"/> to convert.
/// </param>
/// <returns>
/// The <see cref="Bgra32"/>.
/// </returns>
public static Color ToSrgb(Color linear)
{
// TODO: Figure out a way to either cache these values quickly or perform the calcuations together.
linear.R = LinearToSrgb(linear.R);
linear.G = LinearToSrgb(linear.G);
linear.B = LinearToSrgb(linear.B);
return linear;
}
/// <summary>
/// Gets the correct linear value from an sRGB signal.
/// <see href="http://www.4p8.com/eric.brasseur/gamma.html#formulas"/>
/// <see href="http://entropymine.com/imageworsener/srgbformula/"/>
/// </summary>
/// <param name="signal">The signal value to convert.</param>
/// <returns>
/// The <see cref="float"/>.
/// </returns>
private static float SrgbToLinear(float signal)
{
if (signal <= 0.04045f)
{
return signal / 12.92f;
}
return (float)Math.Pow((signal + 0.055f) / 1.055f, 2.4f);
}
/// <summary>
/// Gets the correct sRGB value from an linear signal.
/// <see href="http://www.4p8.com/eric.brasseur/gamma.html#formulas"/>
/// <see href="http://entropymine.com/imageworsener/srgbformula/"/>
/// </summary>
/// <param name="signal">The signal value to convert.</param>
/// <returns>
/// The <see cref="float"/>.
/// </returns>
private static float LinearToSrgb(float signal)
{
if (signal <= 0.0031308f)
{
return signal * 12.92f;
}
return (1.055f * (float)Math.Pow(signal, 0.41666666f)) - 0.055f;
}
}
}

4
src/ImageProcessor/Filters/Brightness.cs

@ -66,12 +66,12 @@ namespace ImageProcessor.Filters
/// </returns> /// </returns>
private static Color AdjustBrightness(Color color, float brightness) private static Color AdjustBrightness(Color color, float brightness)
{ {
color = PixelOperations.ToLinear(color); color = Color.InverseCompand(color);
Vector3 vector3 = color.ToVector3(); Vector3 vector3 = color.ToVector3();
vector3 += new Vector3(brightness, brightness, brightness); vector3 += new Vector3(brightness, brightness, brightness);
return PixelOperations.ToSrgb(new Color(vector3, color.A)); return Color.Compand(new Color(vector3, color.A));
} }
} }
} }

4
src/ImageProcessor/Filters/ColorMatrix/ColorMatrixFilter.cs

@ -50,7 +50,7 @@ namespace ImageProcessor.Filters
/// </returns> /// </returns>
private static Color ApplyMatrix(Color color, Matrix4x4 matrix) private static Color ApplyMatrix(Color color, Matrix4x4 matrix)
{ {
color = PixelOperations.ToLinear(color); color = Color.InverseCompand(color);
float sr = color.R; float sr = color.R;
float sg = color.G; float sg = color.G;
@ -60,7 +60,7 @@ namespace ImageProcessor.Filters
color.G = (sr * matrix.M12) + (sg * matrix.M22) + (sb * matrix.M32) + matrix.M42; 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; color.B = (sr * matrix.M13) + (sg * matrix.M23) + (sb * matrix.M33) + matrix.M43;
return PixelOperations.ToSrgb(color); return Color.Compand(color);
} }
} }
} }

4
src/ImageProcessor/Filters/Contrast.cs

@ -65,7 +65,7 @@ namespace ImageProcessor.Filters
/// </returns> /// </returns>
private static Color AdjustContrast(Color color, float contrast) private static Color AdjustContrast(Color color, float contrast)
{ {
color = PixelOperations.ToLinear(color); color = Color.InverseCompand(color);
// Seems to be faster than Vector3. // Seems to be faster than Vector3.
color.R -= 0.5f; color.R -= 0.5f;
@ -80,7 +80,7 @@ namespace ImageProcessor.Filters
color.B *= contrast; color.B *= contrast;
color.B += 0.5f; color.B += 0.5f;
return PixelOperations.ToSrgb(color); return Color.Compand(color);
} }
} }
} }

1
src/ImageProcessor/ImageProcessor.csproj

@ -47,7 +47,6 @@
<Compile Include="Colors\Color.cs" /> <Compile Include="Colors\Color.cs" />
<Compile Include="Common\Extensions\EnumerableExtensions.cs" /> <Compile Include="Common\Extensions\EnumerableExtensions.cs" />
<Compile Include="Common\Helpers\ImageMaths.cs" /> <Compile Include="Common\Helpers\ImageMaths.cs" />
<Compile Include="Common\Helpers\PixelOperations.cs" />
<Compile Include="Filters\Blend.cs" /> <Compile Include="Filters\Blend.cs" />
<Compile Include="Filters\ColorMatrix\IColorMatrixFilter.cs" /> <Compile Include="Filters\ColorMatrix\IColorMatrixFilter.cs" />
<Compile Include="Filters\Convolution\Convolution2PassFilter.cs" /> <Compile Include="Filters\Convolution\Convolution2PassFilter.cs" />

6
src/ImageProcessor/Samplers/Resize.cs

@ -97,8 +97,7 @@ namespace ImageProcessor.Samplers
} }
int originX = xw.Index; int originX = xw.Index;
Color sourceColor = PixelOperations.ToLinear(source[originX, originY]); Color sourceColor = Color.InverseCompand(source[originX, originY]);
if (Math.Abs(sourceColor.A) < Epsilon) if (Math.Abs(sourceColor.A) < Epsilon)
{ {
continue; continue;
@ -113,8 +112,7 @@ namespace ImageProcessor.Samplers
} }
} }
destination = PixelOperations.ToSrgb(destination); target[x, y] = Color.Compand(destination);
target[x, y] = destination;
} }
} }
}); });

2
src/ImageProcessor/project.lock.json.REMOVED.git-id

@ -1 +1 @@
eb00c54ee74016c2b70f81963e7e8f83cb2dd54b 3f05708641eb3ed085d4689aae4a960eb067fd16
Loading…
Cancel
Save