C++將圖片轉換爲馬賽克效果
1. 算法原理
求出每個小方塊內所有像素的顏色平均值,然後用來設置爲該小方塊的顏色。依次處理每個小方塊,即可實現馬賽克效果
原圖
2. 整張圖片處理成馬賽克效果
#include "stdafx.h"
#include <graphics.h>
#define N 8
int main()
{
//Step1: 加載圖片
IMAGE image;
loadimage(&image, L"C:\\test\\image.jpg");
initgraph(image.getwidth(), image.getheight()); //用圖片的大小初始化窗口大小
putimage(0, 0, &image);
//Step2: 對圖片經行處理
for (int i = 0; i < image.getheight(); i += N) //遍歷整張圖片, 步長爲N, 即將整張圖片分割成若干張N*N大小的小方格,再對每一個N*N的方格依次處理
for (int j = 0; j < image.getwidth(); j += N)
{
int red = 0, green = 0, blue = 0;
for (int x = i; x < i + N; x++) //遍歷該小方格(大小: N*N)
for (int y = j; y < j + N; y++)
{
COLORREF color = getpixel(y, x); //用於獲取該點的顏色
red += GetRValue(color); //提取該點顏色的red值
green += GetGValue(color);
blue += GetBValue(color);
}
red /= N*N; //求平均
green /= N*N;
blue /= N*N;
setfillcolor(RGB(red, green, blue)); //將平均後的顏色設置爲當前填充色(只是設置,並沒有填充)
solidrectangle(j, i, j + N, i + N); //填充該小方格(開始填充)
}
//Step3: 保存處理後的圖片
saveimage(L"C:\\test\\mosaic.jpg");
closegraph();
return 0;
}
效果
3. 通過鼠標選取區域填充馬賽克
#include "stdafx.h"
#include <graphics.h>
#define N 8
int main()
{
//Step1: 加載圖片
IMAGE image;
loadimage(&image, L"C:\\test\\image.jpg");
initgraph(image.getwidth(), image.getheight()); //用圖片的大小初始化窗口大小
putimage(0, 0, &image);
//Step2: 監聽鼠標消息
MOUSEMSG m;
while (true)
{
// 獲取一條鼠標消息
m = GetMouseMsg();
switch (m.uMsg)
{
case WM_MOUSEMOVE:
if (m.mkLButton)
{
//Step3: 對圖片區域處理
int red = 0, green = 0, blue = 0;
for (int x = m.y; x < m.y + N; x++)
for (int y = m.x; y < m.x + N; y++)
{
COLORREF color = getpixel(y, x);
red += GetRValue(color);
green += GetGValue(color);
blue += GetBValue(color);
}
red /= N * N;
green /= N * N;
blue /= N * N;
setfillcolor(RGB(red, green, blue));
solidrectangle(m.x, m.y, m.x + N, m.y + N);
}
break;
case WM_LBUTTONDOWN:
break;
case WM_RBUTTONUP:
//Step4: 保存處理後的圖片
saveimage(L"C:\\test\\mosaic.jpg");
closegraph();
return 0; // 按鼠標右鍵退出程序
}
}
return 0;
}
效果