简而言之,我想将图像中的任何像素设置为亮度大于给定阈值的白色。我编写了以下代码,这些代码可以快速准确地实现我的目的。
using (Bitmap image = new Bitmap("C:\\temp\\test1.png"))
{
for (int x = 0; x < image.Width; x++)
{
for (int y = 0; y < image.Height; y++)
{
Color c = image.GetPixel(x, y);
float f = c.GetBrightness(); //From 0 (black) to 1 (white)
if (f > 0.1) { image.SetPixel(x, y, Color.White); }
}
}
image.Save("C:\\temp\\test2.png");
}
但是,感觉到必须一个接一个地循环遍历每个像素是不对的。是否存在使用另一种.NET Imaging或Graphics方法解决此问题的优化方法?
最佳答案
对于某些特殊情况(例如2个阈值的幂),您可以使用位屏蔽技巧来处理32位块,但我怀疑这样做会为您带来很多好处。您提供的代码中更大的开销是GetPixel
和SetPixel
调用,它们的效率非常低。您可以使用LockBits方法极大地加快该过程,并直接从byte[]
处理基础数据。
关于c# - 基于亮度的位图像素替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12932903/