2017-11-28 13:05:25 +01:00
|
|
|
|
using System.Drawing;
|
|
|
|
|
|
2017-11-29 03:42:21 +01:00
|
|
|
|
namespace Resources.Image
|
2017-11-28 13:05:25 +01:00
|
|
|
|
{
|
|
|
|
|
public class ColorError
|
|
|
|
|
{
|
2017-12-14 22:16:29 +01:00
|
|
|
|
public const byte LowLevel = 0x00;
|
|
|
|
|
public const byte HighLevel = 0xff;
|
|
|
|
|
public const byte Treshold = 0x80;
|
2017-11-28 13:05:25 +01:00
|
|
|
|
|
|
|
|
|
public ColorError(Color original)
|
|
|
|
|
{
|
2017-12-14 22:16:29 +01:00
|
|
|
|
var a = NewValue(original.A);
|
|
|
|
|
var r = NewValue(original.R);
|
|
|
|
|
var g = NewValue(original.G);
|
|
|
|
|
var b = NewValue(original.B);
|
2017-11-28 13:05:25 +01:00
|
|
|
|
|
2017-12-14 22:16:29 +01:00
|
|
|
|
NewColor = Color.FromArgb(a, r, g, b);
|
2017-11-28 13:05:25 +01:00
|
|
|
|
|
2017-12-14 22:16:29 +01:00
|
|
|
|
ErrorA = original.A - a;
|
2017-11-28 13:05:25 +01:00
|
|
|
|
ErrorR = original.R - r;
|
|
|
|
|
ErrorG = original.G - g;
|
|
|
|
|
ErrorB = original.B - b;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Color NewColor { get; }
|
2017-12-14 22:16:29 +01:00
|
|
|
|
public int ErrorA { get; }
|
2017-11-28 13:05:25 +01:00
|
|
|
|
public int ErrorR { get; }
|
|
|
|
|
public int ErrorG { get; }
|
|
|
|
|
public int ErrorB { get; }
|
2017-12-14 22:16:29 +01:00
|
|
|
|
public bool IsZero => ErrorA == 0 && ErrorR == 0 && ErrorG == 0 && ErrorB == 0;
|
2017-11-28 13:05:25 +01:00
|
|
|
|
|
|
|
|
|
public Color ApplyError(Color color, int part, int total)
|
|
|
|
|
{
|
|
|
|
|
return Color.FromArgb(
|
2017-12-14 22:16:29 +01:00
|
|
|
|
CheckBounds(color.A + ErrorA * part / total),
|
2017-11-28 13:05:25 +01:00
|
|
|
|
CheckBounds(color.R + ErrorR * part / total),
|
|
|
|
|
CheckBounds(color.G + ErrorG * part / total),
|
|
|
|
|
CheckBounds(color.B + ErrorB * part / total)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-14 22:16:29 +01:00
|
|
|
|
private static byte NewValue(byte value)
|
2017-11-28 13:05:25 +01:00
|
|
|
|
{
|
2017-12-14 22:16:29 +01:00
|
|
|
|
return value < Treshold ? LowLevel : HighLevel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static byte CheckBounds(int value)
|
|
|
|
|
{
|
|
|
|
|
return (byte) (value < LowLevel ? LowLevel : (value > HighLevel ? HighLevel : value));
|
2017-11-28 13:05:25 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|