1.开门见山
本项目利用easyX图形库完成,初代版本利用函数获取像素颜色后,给字体染色并打印,结果观感极差,经过优化后制作出第二版,先用矩形填充像素区域,然后再打印纯色字体,减轻滤镜效果带来的影响,所以本项目的实现原理并不困难,所以就不再拆成接口给大家讲解了。
2.应用场景
制作大型趣味广告横幅,用于商业增色或婚礼浪漫,可在源码上进行多维优化。
3.项目实现
#include <iostream>
#include <graphics.h>
using namespace std;
int main(void) {
char str[256] = " ";
cout << "请输入想要说的话:";
scanf_s("%s", str, sizeof(str));
int count = strlen(str) / 2;
char** data = (char**)malloc(sizeof(char*) * count);//创建一个字符串数组,数组中含有count个字符串
for (int i = 0; i < count; i++) {
data[i] = (char*)malloc(3); // 一个汉字两个字节和一个字符串结束符
strncpy(data[i], &str[i * 2], 2);
data[i][2] = 0; // 设置字符串结束符
}
IMAGE img1;
loadimage(&img1, "kaixa.png"); // 源图片自备,建议少于4k像素,4090显卡随意
int pic_width = img1.getwidth();
int pic_height = img1.getheight();
initgraph(80, 40);
int* pixcolor;
pixcolor = new int[pic_width * pic_height];
SetWorkingImage(&img1);
for (int i = 0; i < pic_height; i++) {
for (int j = 0; j < pic_width; j++) {
pixcolor[i * pic_width + j] = getpixel(j, i);// 收集像素信息
}
}
SetWorkingImage();
IMAGE img2;
loadimage(&img2, "bk.png", pic_width * 16, pic_height * 16); // 设置画板,源图片自备,
// 建议纯白
img2.Resize(pic_width * 16, pic_height * 16);
SetWorkingImage(&img2);
LOGFONT f;
gettextstyle(&f);
f.lfHeight = 16;
f.lfWidth = 0;
strcpy(f.lfFaceName, "黑体");
f.lfQuality = ANTIALIASED_QUALITY;// 设置字体
setbkmode(TRANSPARENT);
int index = 0;
for (int i = 0; i < pic_height; i++) {
for (int j = 0; j < pic_width; j++) {
int x = j * 16;
int y = i * 16;
setfillcolor(pixcolor[i * pic_width + j]);
fillrectangle(x, y, x + 16, y + 16);
settextcolor(BLACK);
outtextxy(x, y, data[index]);
index = (index + 1) % count;
}
}
SetWorkingImage();
saveimage("D:/csdn_akgry_pic.jpg", &img2);
system("pause");
closegraph();
return 0;
}