项目名称
图片转马赛克
测试环境
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 打码之后