我正在处理包含图像处理的任务。我发现,我一遍又一遍地重复一个代码(DRY警报),我只是好奇,是否有办法避免它。
代码是:
for (int x = 0; x < image.Width; x++)
{
for (int y = 0; y < image.Height; y++)
{
byte pixelValue = Convert.ToByte(Byte.MaxValue * image.GetPixel(x, y).GetBrightness());
//Do something with pixelValue
}
}
各种各样的任务很广泛,一旦我创建直方图,然后我正在对图像进行阈值处理等等......我觉得可能有一些使用代表的解决方案,但我对它们的经验有限且很明显这个并不是最重要的想法。
您是否也可以在.NET Framework 2.0中提出解决方案?
由于
答案 0 :(得分:1)
我不知道2.0,但在4.0中它可能是
public void VisitPixels(Image image, Action<int,int,Pixel> func){
for (int x = 0; x < image.Width; x++)
{
for (int y = 0; y < image.Height; y++)
{
func(x,y,image.GetPixel(x,y));
}
}
}
如果你想要一个返回值,它会变得有点棘手,但你可以把它想象成Map
或Fold
<强>地图
伪:
public T[][] MapPixels<T>(Image image, Func<int,int,Pixel,T> func){
var ret = new T[image.Width][image.Height];
for (int x = 0; x < image.Width; x++)
{
for (int y = 0; y < image.Height; y++)
{
ret[x][y] = func(x,y,image.GetPixel(x,y)));
}
}
return ret;
}
<强>折叠强>
public T FoldLPixels<T>(Image image, Func<T,Pixel,T> func, T acc){
var ret = acc;
for (int x = 0; x < image.Width; x++)
{
for (int y = 0; y < image.Height; y++)
{
ret = func(ret,image.GetPixel(x,y));
}
}
return ret;
}
然后,您可以获得平均亮度,如:
var avgBright = FoldLPixels(image,
(a,b)=>a+b.GetBrightness(),
0) / (image.Width+image.Height);
答案 1 :(得分:0)
你可以这样做:
public static void ProcessPixelValues(Image image, Action<int, int, byte> processPixelValue)
{
for (int x = 0; x < image.Width; x++)
{
for (int y = 0; y < image.Height; y++)
{
byte pixelValue = Convert.ToByte(Byte.MaxValue * image.GetPixel(x, y).GetBrightness());
processPixelValue(x, y, pixelValue);
}
}
}
public static void PrintPixelValuesOfImage(Image image)
{
Action<int, int, byte> processPixelValue =
(x, y, pixelValue) => Console.WriteLine("The pixel value of [{0},{1}] is {2}", x, y, pixelValue);
ProcessPixelValues(image, processPixelValue);
}
C#2.0代码
public delegate void ProcessPixelValueCallback(int x, int y, byte pixelValue);
public static void ProcessPixelValues(Image image, ProcessPixelValueCallback processPixelValue)
{
for (int x = 0; x < image.Width; x++)
{
for (int y = 0; y < image.Height; y++)
{
byte pixelValue = Convert.ToByte(Byte.MaxValue * image.GetPixel(x, y).GetBrightness());
processPixelValue(x, y, pixelValue);
}
}
}
public static void PrintPixelValuesOfImage(Image image)
{
ProcessPixelValueCallback processPixelValue = delegate(int x, int y, byte pixelValue)
{
Console.WriteLine("The pixel value of [{0},{1}] is {2}", x, y, pixelValue);
};
ProcessPixelValues(image, processPixelValue);
}