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 打码之后

猜你喜欢

转载自blog.csdn.net/Mr_HCW/article/details/81879207