我是 C# 的新手,对于我的第二个项目,我正在尝试编写一个使用 Floyd-Steinberg 方法抖动位图的算法,我遵循 Coding Trains Video 但我得到了一堆 RGB 值超出范围的错误,因为例如,有时值是 256,有时甚至是负数。
这是重要的代码块。
static public Bitmap Imagedither(Bitmap original)
{
for (int y = 0; y < original.Height - 1; y++)
{
for (int x = 1; x < original.Width - 1; x++)
{
Color oldPixel = original.GetPixel(x, y);
Color newPixel = roundColor(oldPixel, 1);
original.SetPixel(x, y, newPixel);
Error error = new Error(oldPixel.R - newPixel.R, oldPixel.G - newPixel.G, oldPixel.B - newPixel.B);
original.SetPixel(x + 1, y , AddError(original.GetPixel(x + 1, y), error, 7 / 16.0));
original.SetPixel(x - 1, y + 1, AddError(original.GetPixel(x - 1, y + 1), error, 3 / 16.0));
original.SetPixel(x , y + 1, AddError(original.GetPixel(x, y + 1), error, 5 / 16.0));
original.SetPixel(x + 1, y + 1, AddError(original.GetPixel(x + 1, y + 1), error, 1 / 16.0));
}
}
return original;
}
static public Color roundColor(Color color, int factor)
{
double R = (double)factor * color.R / 255.0;
double newR = Math.Round(R) * (255 / factor);
double G = (double)factor * color.G / 255.0;
double newG = Math.Round(G) * (255 / factor);
double B = (double)factor * color.B / 255.0;
double newB = Math.Round(B) * (255 / factor);
return Color.FromArgb((int)newR, (int)newG, (int)newB);
}
static public Color AddError(Color pixel, Error error, double amount)
{
int R = (int)(pixel.R + (error.R * amount));
int G = (int)(pixel.G + (error.G * amount));
int B = (int)(pixel.B + (error.B * amount));
return Color.FromArgb(R > 255 ? 255 : R, G > 255 ? 255 : G, B > 255 ? 255 : B);
}
public class Error
{
public double R { get; set; }
public double G { get; set; }
public double B { get; set; }
public Error() { }
public Error(double r, double g, double b)
{
R = r;
G = g;
B = b;
}
}