項目名稱
圖片轉馬賽克
測試環境
VS2013
準備
一張圖片
安裝圖形庫 (下載官網)
涉及到的知識
主要就是圖形庫的一些簡單函數的應用(需要積累)
部分函數說明 函數名 功能 調用方式 參數說明 getpixel
用於獲取點的顏色
COLORREF getpixel(int x, int y); (x,y)點爲座標 GetRValue 用於返回指定顏色中的紅色值
GetRValue(COLORREF rgb); rgb爲指定的顏色 setfillcolor 用於設置當前的填充顏色
setfillcolor(COLORREF color); color爲填充顏色 solidrectangle 用於畫填充矩形(無邊框)
soildrectangle(,,,) 左上角,右下角 saveimage 用於保存繪圖內容至圖片文件
saveimage(FileName,IMAGE*) 文件名和IMAGE對象指針
原理
把圖片分成若干小塊, 獲取每個小塊中每個像素點的顏色(RGB值), 求平均值, 把平均後的RGB值填充照片
程序代碼(含註釋)
#include<graphics.h>
#include<stdio.h>
#define n 8 //n的值越大,圖像越模糊 //每個單元格設置成 8*8 (單位:像素點)
int main()
{
IMAGE img; //定義一個圖片變量,用來存放圖片
loadimage(&img,L"picture.jpg"); //加載圖片
initgraph(img.getwidth(), img.getheight()); //以圖片的長和寬初始化窗口
putimage(0, 0, &img); //檢驗圖片是否加載成功
COLORREF color; //定義一個顏色變量, 用來存放顏色
long red, green, blue; //存放RGB值
for (int i = 0; i < img.getheight()/n;i++)
for (int j = 0; j < img.getwidth()/n; j++)
{
red = green = blue = 0; //每次初始化0
//對每個單元進行處理, 得到裏面所有點(64個點)的RGB的值,再求平均值
for (int x = 0; x < n;x++)
for (int y = 0; y < n; y++)
{
color=getpixel(n*j + x, n*i + y); //得到該點的RGB值
red += GetRValue(color); //提取color中R的值, 求和
green += GetGValue(color); //提取color中G的值, 求和
blue += GetBValue(color); //提取color中B的值, 求和
}
red /= n * n; //取平均值
green /= n * n;
blue /= n * n;
setfillcolor(RGB(red, green, blue)); //將平均後的RGB值設置當前填充色
solidrectangle(n*j,n*i,n*j+n,n*i+n); //對每個n*n的小單位開始填充
}
//保存圖片 方案一
//IMAGE newImage;
//getimage(&newImage,0,0,img.getwidth(),img.getheight()); //將img傳遞給newImage
//saveimage(L"newPicture.jpg",&newImage); //以文件形式保存片
saveimage(L"newPicture.jpg"); //保存圖片 方案二 (第二個參數省略,默認當前窗口的圖片)
getchar();
closegraph();
return 0;
}
效果顯示
打碼之前 VS 打碼之後