使用image(委托应用程序)时减少冗余代码?

时间:2011-03-23 09:42:36

标签: c# delegates dry

我正在处理包含图像处理的任务。我发现,我一遍又一遍地重复一个代码(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中提出解决方案?

由于

2 个答案:

答案 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));
    }
  }
}

如果你想要一个返回值,它会变得有点棘手,但你可以把它想象成MapFold

<强>地图

伪:

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);
}