C# 实现马赛克

C# 实现马赛克_第1张图片

说到马赛克,大家一定不陌生。(此处略去1万字)
但是该如何利用编程语言实现呢?
使用工具:
C#
Visual Studio 2015 Community

原理:
大家都知道,一张图片是由一个一个像素组成。这些像素呢逐次排列,就好像方格纸一样。(密集恐惧症慎入) 每个格子都是一个特定的颜色。


C# 实现马赛克_第2张图片

那么怎么实现马赛克呢?说白了呢,就是实现下面的一个转换(每个字母代表一个像素,假设马赛克的范围为2):


C# 实现马赛克_第3张图片

间隔选取像素点(如ACE...),接着填充至周围的格子中。
实战:
首先要用到System.Drawing

一般创建Win窗口程序时都已经引用了。我们要用到里面的Bitmap
类来进行图片的读取和写入操作。
构造一个函数

public static Bitmap imgMosaic(Bitmap img, int a)  //img为输入的图像,a为马赛克的范围
{
  for (int h = 0; h < img.Height; h += a)         //两层循环,遍历每一个间隔的像素点
  {
    for (int w = 0; w < img.Width; w += a)      
    {
        Color xxx = img.GetPixel(w, h);         //获取颜色
        for (int x = w; (x < w + a && x < img.Width); x++)        //另一层循环,填充颜色
        {
            for (int y = h; (y < h + a && y < img.Height); y++)
            {
                img.SetPixel(x, y, xxx);
            }
        }
     }
  }
  return img;
}    

至于效果么。。你们自己感受一下:


C# 实现马赛克_第4张图片

其实挺好了,已经有马赛克的效果了。
我又想:怎么让马赛克的效果更好呢?问题是ACE这样的像素可能不能代表周围的一圈像素。
于是,我们可以取ABGH的RGB平均值再填入这些像素中。代码如下

public static Bitmap imgMosaic2(Bitmap img, int a)
{
  for (int h = 0; h < img.Height; h += a)
  {
    for (int w = 0; w < img.Width; w += a)
    {
        int avgR = 0, avgG = 0, avgB = 0;
        int count = 0;
        for (int x = w; (x < w + a && x < img.Width); x++)
        {
            for (int y = h; (y < h + a && y < img.Height); y++)
            {
                Color pix = img.GetPixel(x, y);
                avgR += pix.R;
                avgG += pix.G;
                avgB += pix.B;
                count++;
            }
        }
        avgR = avgR / count;
        avgG = avgG / count;
        avgB = avgB / count;
        for (int x = w; (x < w + a && x < img.Width); x++)
        {
            for (int y = h; (y < h + a && y < img.Height); y++)
            {
                Color newColor = Color.FromArgb(avgR, avgG, avgB);
                img.SetPixel(x, y, newColor);
            }
        }
    }
  }
  return img;
}

再来感受一下效果:


C# 实现马赛克_第5张图片


瞬间感觉好多了。
至于导入图片:

image1 = new Bitmap(@"C:\img.jpg", true);    //@后换成自己想要的路径就可以了

你可能感兴趣的:(C# 实现马赛克)