程序背景:
前段时间在某音APP上看到一些有趣的视频,视频的内容是:一个小哥在电脑的记事本里敲了很多很多杂乱无章的符号,然后当这个小哥把记事本的字体调到最小的时候,所有的字符浓缩成了一幅黑白“字符”照片,照片是一个漂亮小姐姐。看了这个视频我感觉这些字符绝对不是他一个一个敲上去的,这种事情当然是程序做出来的。不过这个程序我也可以做。
我的思路:
我是这样想的,QT里刚好有加载图片的类,可以获取每一个像素点的RGB值,获取到的RGB是彩色的,把这个彩色转换成灰色,然后根据灰色的深浅输出单位面积内不同灰度的字符。我记得灰色图片的RGB值R、G、B这三个值是相等的,所以我猜把一张图片转换成灰色是把RGB这三个值加起来除以3,上网搜了一下的确这样转换是可行的,,不过也有一个更加精确的公式: R*0.299 + G*0.587 + B*0.114。
代码详解:
核心功能函数
void MainWidget::work(){
//写入数据的txt
QFile data("file.txt");
QColor imgColor;
int rgb;
QString str;
//按像素点遍历RGB值
for(int y = 0; y < img.height(); y+=add_val) //add_val值越小字符图片越精确
{
str="";
for(int x = 0; x < img.width(); x+=add_val)
{
//获取x,y坐标像素的rgb值
imgColor = img.pixel(x,y);
//计算灰度值,并缩小十倍
rgb = (imgColor.red()+imgColor.green()+imgColor.blue())/30;
//根据不同的灰度值输出不同灰度的字符
switch(rgb){
case 0:
printf("MM");
str+="MM";
break;
case 1:
printf("MB");
str+="MB";
break;
case 2:
printf("XM");
str+="XM";
break;
case 3:
printf("WQ");
str+="WQ";
break;
case 4:
printf("WO");
str+="WO";
break;
case 5:
printf("BB");
str+="BB";
break;
case 6:
printf("BQ");
str+="BQ";
break;
case 7:
printf("BL");
str+="BL";
break;
case 8:
printf("8G");
str+="8G";
break;
case 9:
printf("GO");
str+="GO";
break;
case 10:
printf("SL");
str+="SL";
break;
case 11:
printf("8|");
str+="8|";
break;
case 12:
printf("/L");
str+="/L";
break;
case 13:
printf("7v");
str+="7v";
break;
case 14:
printf("jv");
str+="jv";
break;
case 15:
printf("iv");
str+="iv";
break;
case 16:
printf("v/");
str+="v/";
break;
case 17:
printf("v.");
str+="v.";
break;
case 18:
printf("j;");
str+="j;";
break;
case 19:
printf("//");
str+="//";
break;
case 20:
printf("/;");
str+="/;";
break;
case 21:
printf(";;");
str+=";;";
break;
case 22:
printf(";:");
str+=";:";
break;
case 23:
printf("::");
str+="::";
break;
default:
//qDebug()<<" ";
printf(" ");
str+=" ";
}
}
//将字符写入到文件
if (data.open(QFile::WriteOnly | QIODevice::Append | QIODevice::Text)) {
QTextStream out(&data);
out << str << endl;
}
data.close();
printf("\n");
}
//打开txt文件
system("file.txt");
}
效果图:
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}