实现网红程序:字符图片

qi.wei

发布于 2018.10.11 23:17 阅读 2424 评论 0

 

程序背景:

      前段时间在某音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");
}

 

 

效果图: