C#中的图像色调修改

我有一个图像,我想将该特定图像的色调修改为特定值。 我知道rgb到hsl和hsl到rgb转换数学公式但是我无法将这个东西实现到c#中。

以下是伪:

for(x=0;x<image_width;x++) { for(y=0;y<image_height;y++) { Color oldColor=GetColorFromPixel(x,y); Color newColor=ModifyHue(oldColor); SetColorPixel(x,y,newColor); } } 

谢谢

由于事实, Color结构已经有GetHue()GetSaturation()GetBrightness()因此从这些值构造颜色也会很好。 所以我不久前在网上的某处发现了以下代码(目前无法再找到它,但它来自微软的家伙博客,他还有一个测试,逐步完成所有KnownColor )。

 ///  /// Creates a Color from alpha, hue, saturation and brightness. ///  /// The alpha channel value. /// The hue value. /// The saturation value. /// The brightness value. /// A Color with the given values. public static Color FromAhsb(int alpha, float hue, float saturation, float brightness) { if (0 > alpha || 255 < alpha) { throw new ArgumentOutOfRangeException("alpha", alpha, "Value must be within a range of 0 - 255."); } if (0f > hue || 360f < hue) { throw new ArgumentOutOfRangeException("hue", hue, "Value must be within a range of 0 - 360."); } if (0f > saturation || 1f < saturation) { throw new ArgumentOutOfRangeException("saturation", saturation, "Value must be within a range of 0 - 1."); } if (0f > brightness || 1f < brightness) { throw new ArgumentOutOfRangeException("brightness", brightness, "Value must be within a range of 0 - 1."); } if (0 == saturation) { return Color.FromArgb(alpha, Convert.ToInt32(brightness * 255), Convert.ToInt32(brightness * 255), Convert.ToInt32(brightness * 255)); } float fMax, fMid, fMin; int iSextant, iMax, iMid, iMin; if (0.5 < brightness) { fMax = brightness - (brightness * saturation) + saturation; fMin = brightness + (brightness * saturation) - saturation; } else { fMax = brightness + (brightness * saturation); fMin = brightness - (brightness * saturation); } iSextant = (int)Math.Floor(hue / 60f); if (300f <= hue) { hue -= 360f; } hue /= 60f; hue -= 2f * (float)Math.Floor(((iSextant + 1f) % 6f) / 2f); if (0 == iSextant % 2) { fMid = hue * (fMax - fMin) + fMin; } else { fMid = fMin - hue * (fMax - fMin); } iMax = Convert.ToInt32(fMax * 255); iMid = Convert.ToInt32(fMid * 255); iMin = Convert.ToInt32(fMin * 255); switch (iSextant) { case 1: return Color.FromArgb(alpha, iMid, iMax, iMin); case 2: return Color.FromArgb(alpha, iMin, iMax, iMid); case 3: return Color.FromArgb(alpha, iMin, iMid, iMax); case 4: return Color.FromArgb(alpha, iMid, iMin, iMax); case 5: return Color.FromArgb(alpha, iMax, iMin, iMid); default: return Color.FromArgb(alpha, iMax, iMid, iMin); } } 

使用此function,您可以在HSL演示文稿中的HSB(或HSV)颜色演示文稿中工作。 有关它们之间差异的更多信息,请查看此维基百科文章 。

如果您只想尝试或性能不重要,那么最简单的方法是使用Bitmap.GetPixelBitmap.SetPixel方法:

 var bm = new Bitmap(filename); for(int x=0;x 

如果您想要更高性能的操作,您应该查看Bitmap.LockBits方法,该方法将整个位图修复到内存位置,并允许您直接修改此内存。