說到馬賽克,大家一定不陌生熊咽。(此處略去1萬字)
但是該如何利用編程語言實現(xiàn)呢?
使用工具:
C#
Visual Studio 2015 Community
原理:
大家都知道闹丐,一張圖片是由一個一個像素組成横殴。這些像素呢逐次排列,就好像方格紙一樣卿拴。(密集恐懼癥慎入) 每個格子都是一個特定的顏色衫仑。
那么怎么實現(xiàn)馬賽克呢?說白了呢堕花,就是實現(xiàn)下面的一個轉(zhuǎn)換(每個字母代表一個像素文狱,假設(shè)馬賽克的范圍為2):
間隔選取像素點(diǎn)(如ACE...),接著填充至周圍的格子中缘挽。
實戰(zhàn):
首先要用到System.Drawing
一般創(chuàng)建Win窗口程序時都已經(jīng)引用了瞄崇。我們要用到里面的Bitmap
類來進(jìn)行圖片的讀取和寫入操作。
構(gòu)造一個函數(shù)
public static Bitmap imgMosaic(Bitmap img, int a) //img為輸入的圖像壕曼,a為馬賽克的范圍
{
for (int h = 0; h < img.Height; h += a) //兩層循環(huán)苏研,遍歷每一個間隔的像素點(diǎn)
{
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++) //另一層循環(huán),填充顏色
{
for (int y = h; (y < h + a && y < img.Height); y++)
{
img.SetPixel(x, y, xxx);
}
}
}
}
return img;
}
至于效果么摹蘑。轧飞。你們自己感受一下:
其實挺好了塘安,已經(jīng)有馬賽克的效果了援奢。
我又想:怎么讓馬賽克的效果更好呢集漾?問題是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;
}
再來感受一下效果:
瞬間感覺好多了孩哑。
至于導(dǎo)入圖片:
image1 = new Bitmap(@"C:\img.jpg", true); //@后換成自己想要的路徑就可以了