C++ 圖片轉馬賽克

項目名稱

         圖片轉馬賽克

測試環境

          VS2013

準備

          一張圖片

          安裝圖形庫 (下載官網)

 涉及到的知識

           主要就是圖形庫的一些簡單函數的應用(需要積累)

部分函數說明
函數名 功能 調用方式 參數說明

getpixel

用於獲取點的顏色

COLORREF getpixel(int x, int y); (x,y)點爲座標
GetRValue

用於返回指定顏色中的紅色值

GetRValue(COLORREF rgb); rgb爲指定的顏色
setfillcolor

用於設置當前的填充顏色

setfillcolor(COLORREF color); color爲填充顏色
solidrectangle

用於畫填充矩形(無邊框)

soildrectangle(x_1,y_1,x_2,y_2) (x_1,y_1)左上角,(x_2,y_2)右下角
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 打碼之後

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章