QT实现文字取模的原理

配合POVLED上下位机工作还需要一个软件用于将需要显示的图形的位模形生成,分为文字和图片,在这里我们先讲解下文字字模的取法。

在QT中图片使用功能QImage类存储,又支持很多种数据格式,Format_ARGB32,等格式,像这种格式每个像素需要32位数据存储,第一字节是透明度,红色,绿色,蓝色。

实现该功能的基本原理是将目标文字写到16x16像素的图片中,白底黑字,然后通过遍历图片像素,将像素底色白色为0,黑色为1,存储到目标数组中,一个汉字可以生成 32 byte数组。

具体实现代码

捕获


mainWidget::mainWidget(QWidget *parent)
    : QWidget(parent)
{
    paintArea = new PaintArea;
    pLineEdit = new QLineEdit;
    pTextBrower = new QTextBrowser;
    pPushButton = new QPushButton;
    //pinputString = new QString;
    pLineEdit->setFixedWidth(500);
    pLineEdit->setFixedHeight(25);
    pPushButton->setText("确定");
    pPushButton->setFixedHeight(25);

    rightLayout = new QGridLayout;
    rightLayout->addWidget(pLineEdit,0,0);
    rightLayout->addWidget(pPushButton,0,1);
    rightLayout->addWidget(pTextBrower,1,0);
    QHBoxLayout *mainLayout = new QHBoxLayout(this);
    mainLayout->addWidget(paintArea);
    mainLayout->addLayout(rightLayout);
    mainLayout->setStretchFactor(paintArea,0);
    mainLayout->setStretchFactor(rightLayout,1);

    connect(pPushButton,SIGNAL(clicked()),this,SLOT(pushbutton_clicked()));
}

mainWidget::~mainWidget()
{
}

void mainWidget::pushbutton_clicked()
{
    qDebug() << "button clocked";
    qDebug() << pLineEdit->text();
    pinputString = pLineEdit->text();
    qDebug() << QString(pinputString[0]);
    qDebug() << QString(pinputString[1]);
    qDebug() << pinputString.size();

    QSize size(16,16);
    QImage image(size,QImage::Format_ARGB32);
    image.fill(Qt::white);

    QPainter painter(&image);
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    QPen ppen = painter.pen();
    ppen.setColor(Qt::black);
    QFont pfont = painter.font();
    pfont.setBold(true);
    pfont.setPixelSize(16);
    painter.setPen(ppen);
    painter.setFont(pfont);

    painter.drawText(image.rect(),Qt::AlignLeft | Qt::AlignVCenter,QString(pinputString[0]));
    image.save("C:/Users/Administrator/Desktop/LED_ARY/build-codeary-Desktop_Qt_5_9_9_MinGW_32bit-Debug/debug/myImage.png");

    uchar hziCode[32];
    uint hanzicode = 0;     
    for(unsigned char i = 0;i < 16;i++)
    {
        hanzicode = 0;
        for(unsigned char j = 0;j < 16; j++)
        {
            hanzicode <<= 1;
            if(image.pixel(i,j) == 0xff000000)
            {
                hanzicode |= 1;
            }
        }
        //qDebug("%",hanzicode);
        qDebug("%s",qPrintable(QString::number(hanzicode,2).rightJustified(16,'0')));
        hziCode[2*i] = uchar(hanzicode >>8);
        hziCode[2*i+1] =uchar( hanzicode);

        qDebug("%s%s",qPrintable(QString::number( hziCode[2*i],2).rightJustified(8,'0')),qPrintable(QString::number(hziCode[2*i+1],2).rightJustified(8,'0')));
        //qDebug(";;;");
    }
}
posted @ 2021-05-09 23:33  steven_lg  阅读(1490)  评论(0)    收藏  举报