Qt小玩意儿——简单图片转字符构成的图像(2)(GIF加载)

一般的图片加载见上篇博文:Qt小玩意儿——简单图片转字符构成的图像
效果:
在这里插入图片描述
头文件:

#ifndef IMAGETOTEXT_H
#define IMAGETOTEXT_H

#include <QWidget>
#include <QPlainTextEdit>
#include <QLabel>
#include <QTimerEvent>

class ImageToText : public QWidget
{
    Q_OBJECT
public:
    explicit ImageToText(QWidget *parent = nullptr);
    ~ImageToText();

    void loadImage(const QString &path);
    void loadImages(const QStringList &paths);

    void loadGIF(const QString &path);
protected slots:
    void onSliderValueChanged(int val);
protected:
    void initialize();
    void showText();
    void createGIFCache();
    void clearGIFCache();

    void timerEvent(QTimerEvent *event);
private:
    QPlainTextEdit *m_pPlainText = nullptr;
    QLabel *m_pLabel = nullptr;
    QImage m_img;

    QStringList m_lstPaths;

    int m_nVal = 125;
    int m_nTimerID = -1;
    int m_nIndex = -1;
};

#endif // IMAGETOTEXT_H

源文件:

#include "imagetotext.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QImage>
#include <QPixmap>
#include <QSlider>
#include <QMovie>
#include <QDir>
#include <QDebug>

#define CATCHE_DIR "D:\\cache"

ImageToText::ImageToText(QWidget *parent) : QWidget(parent)
{
    initialize();
}

ImageToText::~ImageToText()
{
    if(m_nTimerID != -1){
        this->killTimer(m_nTimerID);
    }
    clearGIFCache();
}

void ImageToText::loadImage(const QString &path)
{
    m_img = QImage(path);
    m_pLabel->setPixmap(QPixmap::fromImage(m_img));
    m_img = m_img.scaled(100,44);
    showText();
}

void ImageToText::loadImages(const QStringList &paths)
{
    if(paths.isEmpty()){
        return;
    }

    if(m_nTimerID != -1){
        this->killTimer(m_nTimerID);
    }
    m_lstPaths = paths;
    m_nIndex = 0;
    this->startTimer(1000/20);

}

void ImageToText::loadGIF(const QString &path)
{
    clearGIFCache();
    QMovie *pMovie = new QMovie(this);

    pMovie->setFileName(path);

    int nFrameCount = pMovie->frameCount();
    m_lstPaths.clear();
    for (int i = 0; i < nFrameCount; ++i) {
        pMovie->jumpToFrame(i);
        QImage img = pMovie->currentImage();
        QString imgPath = CATCHE_DIR + QString("/") + QString::number(i) + ".jpg";
        img.save(imgPath);
        m_lstPaths.append(imgPath);
    }
    loadImages(m_lstPaths);

}

void ImageToText::onSliderValueChanged(int val)
{
    m_nVal = val;

    showText();
}

void ImageToText::initialize()
{
    QHBoxLayout *pLayout = new QHBoxLayout;
    m_pPlainText = new QPlainTextEdit;
    m_pLabel = new QLabel;
    QSlider *pSliderColor = new QSlider(Qt::Horizontal);
    pSliderColor->setRange(0,255);
    pSliderColor->setValue(m_nVal);

    QVBoxLayout *pVLayout = new QVBoxLayout;
    pVLayout->addWidget(pSliderColor);
    pVLayout->addWidget(m_pLabel);

    pLayout->addLayout(pVLayout);
    pLayout->addWidget(m_pPlainText);
    this->setLayout(pLayout);
    this->resize(1500,750);

    connect(pSliderColor,SIGNAL(valueChanged(int)),this,SLOT(onSliderValueChanged(int)));
}
void ImageToText::showText()
{
    m_pPlainText->clear();
    if(m_img.isNull()){
        return;
    }

    int w = m_img.width();
    int h = m_img.height();
    for(int i=0; i < h;i++)
    {
        QString text;
        for(int j= 0; j < w;j++)
        {
            QRgb pixel = m_img.pixel(j,i);
            int gray = qGray(pixel);
            if(gray > m_nVal){
                text += ".";
            }else{
                text += "*";
            }
        }
        text +"\n";
        m_pPlainText->appendPlainText(text);
    }
}

void ImageToText::createGIFCache()
{
    QDir dir(CATCHE_DIR);
    if(!dir.exists()){
        qDebug() <<  dir.mkdir(CATCHE_DIR);
    }
}

void ImageToText::clearGIFCache()
{
    QDir dir(CATCHE_DIR);

    if(!dir.exists()){
        createGIFCache();
        return;
    }
    qDebug() << dir.removeRecursively();

    createGIFCache();
}

void ImageToText::timerEvent(QTimerEvent *event)
{
    QWidget::timerEvent(event);
    if(m_lstPaths.isEmpty()){
        return;
    }
    if(m_nIndex < 0 ||
            m_nIndex >= m_lstPaths.count()){
        m_nIndex = 0;
    }

    loadImage(m_lstPaths[m_nIndex]);
    m_nIndex++;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值