图片转字符串存储在SQLite中

        将图片转化为字符串放入Sqlite数据库,以BLOB类型存储。

一、主要函数

        1、图片转字符串

        使用内存读写器,指定格式存入字节数组,字节数组转Base64以Latin1编码输出到文本框。

void MainWindow::on_actPtB_triggered()
{
    ui->plainTextEdit->clear();
    if(ui->labPhoto->pixmap().isNull())
    {
        labtext->clear();
        labtext->setText("图片为空");
        return;
    }
    labtext->setText("转换字符串");
    QByteArray byte;
    QBuffer buff(&byte);//创建内存读写器
    buff.open(QIODevice::WriteOnly);
    m_pixmap->save(&buff,"PNG");//指定格式
    ui->plainTextEdit->setPlainText(QString::fromLatin1(byte.toBase64()));
}

         2、字符串转图片

        读取文本框字符串,文本框中存放的字符串,顺序转换格式QString->toLatin1->Base64,Pixmap读取数据(字节数组),最后为QLabel设置图片。

void MainWindow::on_actBtP_triggered()
{
    if(ui->plainTextEdit->toPlainText().isEmpty())
    {
        labtext->clear();
        labtext->setText("空文本");
        return;
    }
    ui->labPhoto->clear();

    QString str=ui->plainTextEdit->toPlainText();//获取字符串
    QByteArray imgData = QByteArray::fromBase64(str.toLatin1());
    QPixmap readStrToPhoto;
    readStrToPhoto.loadFromData(imgData);
    
    double ratio=static_cast<double>(readStrToPhoto.width())/static_cast<double>(readStrToPhoto.height());//保存比例
    //图片大小
    int pixWidth=readStrToPhoto.width();
    int pixHeight=readStrToPhoto.height();
    //组件大小
    int boxWidth=ui->groupBoxPhoto->width();
    int boxHeight=ui->groupBoxPhoto->height();
    if(ui->groupBoxPhoto->width()>pixWidth &&ui->groupBoxPhoto->height()>pixHeight)
    {
        ui->labPhoto->setMaximumSize(QSize(pixWidth,pixHeight));
        ui->labPhoto->setMinimumSize(QSize(pixWidth,pixHeight));
    }
    else
    {
        ui->labPhoto->setMaximumSize(QSize(boxHeight*ratio,boxHeight));
        ui->labPhoto->setMinimumSize(QSize(boxHeight*ratio,boxHeight));
    }
    ui->labPhoto->setPixmap(readStrToPhoto);
}

二、UI界面与主函数

        界面组件主要有Label和plainTextEdit,另一些Action。

        1、构造函数:

namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
public:
    QLabel* labTitle;
    QLabel* labtext;
    QPixmap* m_pixmap;
    QFileInfo aFileInfo;
private:
    void m_PixmapReadPhoto(QString filename);
private slots:
    void on_actAddPhoto_triggered();
    void on_actPtB_triggered();
    void on_actBtP_triggered();
    void on_actClearPhoto_triggered();
    void on_actCut_triggered();
    void on_actCopy_triggered();
    void on_actPaste_triggered();
    void on_actClearText_triggered();
protected:
    void resizeEvent(QResizeEvent* event);
    void dragEnterEvent(QDragEnterEvent* event);//拖拽文件进入窗口时触发
    void dropEvent(QDropEvent* event);
    void dragMoveEvent(QDragMoveEvent *event);
    bool eventFileter(QObject* watched,QEvent* event);
private:
    Ui::MainWindow *ui;
};

        2、主函数: 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_pixmap=new QPixmap();//初始化指针

    ui->labPhoto->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//文本居中
    //状态栏初始化
    labTitle=new QLabel("文件信息: ",this);
    labtext=new QLabel("",this);
    ui->statusbar->addWidget(labTitle);
    ui->statusbar->addWidget(labtext);
    //设置窗口属性
    setWindowFlag(Qt::MSWindowsFixedSizeDialogHint);//显示更窄的边框,固定大小
    this->setWindowFlags(Qt::CustomizeWindowHint|Qt::WindowMinimizeButtonHint| Qt::WindowCloseButtonHint);//被屏蔽最大化
    
    //设置组件
    ui->labPhoto->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);//避免QLabel加载图片时挤压其它空间然后影响整体布局
    ui->labPhoto->setScaledContents(true);//图片自适应大小
    //Action
    QIcon WindowIcon(":/window/window/Title.png");
    setWindowIcon(WindowIcon);
    QIcon iconOpen(":/Icon/icon/open.png");
    QIcon iconToString(":/Icon/icon/toString.png");
    QIcon iconToPhoto(":/Icon/icon/toPhoto.png");
    QIcon iconCopy(":/Icon/icon/copy.png");
    QIcon iconCut(":/Icon/icon/cut.png");
    QIcon iconPaste(":/Icon/icon/paste.png");
    QIcon iconClearString(":/Icon/icon/clearString.png");
    QIcon iconClearPhoto(":/Icon/icon/clearPhoto.png");
    ui->actAddPhoto->setIcon(iconOpen);
    ui->actPtB->setIcon(iconToString);
    ui->actBtP->setIcon(iconToPhoto);
    ui->actCopy->setIcon(iconCopy);
    ui->actCut->setIcon(iconCut);
    ui->actPaste->setIcon(iconPaste);
    ui->actClearText->setIcon(iconClearString);
    ui->actClearPhoto->setIcon(iconClearPhoto);
    ui->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    //设置拖动属性
    // 在构造函数中添加:
    setStyleSheet("QMainWindow { border: 2px dashed #aaa; }");
    this->setAcceptDrops(true);//窗口接受
    ui->centralwidget->setAcceptDrops(false);//中央部件
    ui->labPhoto->setAcceptDrops(false);//放置操作由窗口去处理
    ui->plainTextEdit->setAcceptDrops(false);
    ui->groupBoxPhoto->setAcceptDrops(false);
    ui->groupBoxText->setAcceptDrops(false);
}

三、成员函数

        1、点击添加按钮,添加文件

void MainWindow::on_actAddPhoto_triggered()
{
    QString path=QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);//桌面路径
    QString filename=QFileDialog::getOpenFileName(this,"选择一个图片",path,"图片文件(*.jpg *.png);;所有文件(*.*)");
    m_PixmapReadPhoto(filename);//自定义函数,更新指针变量
    double ratio=static_cast<double>(m_pixmap->width())/static_cast<double>(m_pixmap->height());//保存比例
    //图片大小
    int pixWidth=m_pixmap->width();
    int pixHeight=m_pixmap->height();
    //组件大小
    int boxWidth=ui->groupBoxPhoto->width();
    int boxHeight=ui->groupBoxPhoto->height();
    if(ui->groupBoxPhoto->width()>pixWidth &&ui->groupBoxPhoto->height()>pixHeight)
    {
        ui->labPhoto->setMaximumSize(QSize(pixWidth,pixHeight));
        ui->labPhoto->setMinimumSize(QSize(pixWidth,pixHeight));
    }
    else
    {
        ui->labPhoto->setMaximumSize(QSize(boxHeight*ratio,boxHeight));
        ui->labPhoto->setMinimumSize(QSize(boxHeight*ratio,boxHeight));
    }
    ui->labPhoto->setPixmap(*m_pixmap);
    labtext->clear();
    labtext->setText(QString("Name:%1 ; Time: %2").arg(aFileInfo.fileName()).arg(aFileInfo.fileTime(QFileDevice::FileBirthTime).toString()));
    qDebug()<<filename<<pixWidth<<pixHeight<<boxWidth<<boxHeight<<ratio;
}

        2、拖入文件
        

setAcceptDrops(true);//开启主窗口放置支持
centralWidget()->setAcceptDrops(false);//防止中间部件拦截事件 
dragEnterEvent()//接受拖拽 
dropEvent();//放置后的逻辑 

        

        his->setAcceptDrops(true);//窗口接受
        ui->centralwidget->setAcceptDrops(false);//中央部件
        ui->labPhoto->setAcceptDrops(false);//放置操作由窗口去处理
        ui->plainTextEdit->setAcceptDrops(false);
        ui->groupBoxPhoto->setAcceptDrops(false);
        ui->groupBoxText->setAcceptDrops(false);拖拽事件,不起作用时,会显示禁止图标。

        AcceptDrops属性默认false,在某些情况下可以不设置,拖入事件:

void MainWindow::dragEnterEvent(QDragEnterEvent *event)//拖拽放入事件
{

    for(int i=0;i<event->mimeData()->formats().size();i++)
        qDebug()<<event->mimeData()->formats().at(i);
    //formats():
    //返回对象支持的格式列表。这是一个MIME类型列表,对象可以为其返回合适的数据。列表中的格式按优先级顺序排列。
    //对于最常见的数据类型,您可以调用更高级的函数hasText()、hashhtml()、hasUrls()、hasImage()和hasColor()。
    for(int i=0;i<event->mimeData()->urls().size();i++)
    {
        QUrl url=event->mimeData()->urls().at(i);//带路径的文件名
        qDebug()<<url.path();
    }
    if(event->mimeData()->hasUrls())//Returns true if the object can return a list of urls; otherwise returns false.
    {
        QString filename=event->mimeData()->urls().at(0).fileName();//获取文件名
        QFileInfo fileinfo(filename);//文件信息
        QString ext=fileinfo.suffix().toUpper();//获取文件后缀
        if(ext=="JPG"||ext=="PNG")
            event->acceptProposedAction();//接受拖拽操作

        else
            event->ignore();//忽略事件
    }
}

        接受放置事件:

void MainWindow::dropEvent(QDropEvent *event)//放置事件
{
    qDebug()<<"dropEvent";
    QString filename=event->mimeData()->urls().at(0).path();//完整文件名
    filename=filename.right(filename.length()-1);//去掉最左边的'/'
    m_PixmapReadPhoto(filename);
    QPixmap pixmap(filename);

    double ratio=static_cast<double>(pixmap.width())/static_cast<double>(pixmap.height());//保存比例
    //图片大小
    int pixWidth=pixmap.width();
    int pixHeight=pixmap.height();
    //组件大小
    int boxHeight=ui->groupBoxPhoto->height();
    if(ui->groupBoxPhoto->width()>pixWidth &&ui->groupBoxPhoto->height()>pixHeight)
    {
        ui->labPhoto->setMaximumSize(QSize(pixWidth,pixHeight));
        ui->labPhoto->setMinimumSize(QSize(pixWidth,pixHeight));
    }
    else
    {
        ui->labPhoto->setMaximumSize(QSize(boxHeight*ratio,boxHeight));
        ui->labPhoto->setMinimumSize(QSize(boxHeight*ratio,boxHeight));
    }
    ui->labPhoto->setPixmap(pixmap);

    event->accept();
}

        3、自定义函数,更新成员变量m_pixmap

void MainWindow::m_PixmapReadPhoto(QString filename)
{
    aFileInfo=QFileInfo(filename);//获取文件信息
    m_pixmap=new QPixmap(filename);
    if(m_pixmap->isNull())
    {
        QImageReader reader;
        QImage image;
        reader.setDecideFormatFromContent(true);
        reader.setScaledSize(QSize(width(), height()));
        reader.setFileName(filename);
        if (reader.canRead())//避免文件太大,第一种方式读取文件失败的情况
        {
            if (!reader.read(&image))
            {
                QImageReader::ImageReaderError error = reader.error();
                QString strError = reader.errorString();
                printf("last error:%s\n", strError.toStdString().c_str());
                return;
            }
        }
        *m_pixmap=QPixmap::fromImage(image);//读取图片资源
    }
}

四、测试

        1、转换

  

 

2、放入数据库

 

3、查看

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值