当前位置: 首页 > news >正文

基于 Qt 的 BMP 图像数据存取至 SQLite 数据库的实现

基于 Qt 的 BMP 图像数据存取至 SQLite 数据库的实现说明

本项目通过 Qt 框架实现了将 BMP 图像文件以二进制形式存入 SQLite 数据库,并可从数据库中读取还原为 BMP 图像文件的功能,适用于需要图像与结构化数据统一管理的场景。

整个流程分为两个主要部分:

一、图像保存到数据库

程序首先连接指定的 SQLite 数据库,若数据库文件不存在将自动创建。在读取本地 BMP 图像文件后,将其内容作为二进制数据(BLOB)保存至数据库中的一张名为 Images 的数据表中。表结构简单,仅包含自增主键 id 和存储图像数据的 data 字段。若数据表尚未存在,程序会自动创建。

通过这种方式,图像内容不再依赖文件系统存储,而是与应用数据一同保存在数据库中,有利于集中管理、版本控制与数据传输。

二、从数据库读取图像并保存为文件

读取部分通过指定图像的 id 值从数据库中查询对应的 BLOB 数据,并将其以 BMP 格式写入本地文件。程序在执行过程中提供异常判断,例如数据库连接失败、图像记录不存在、文件写入失败等,确保操作的稳定性和可追踪性。

三、应用场景与扩展性

该方案适用于图像归档、数字资源管理、数据库驱动的图像浏览系统等场景。虽然本文示例以 BMP 图像为主,但该方法同样适用于任意格式的二进制文件,如 PNG、JPG、PDF 等,只需调整文件处理部分即可。此外,数据库结构可扩展,如添加图像名称、分类标签、时间戳等字段,实现更复杂的图像管理系统。

本项目展示了如何将 Qt 与 SQLite 结合,实现图像与数据库之间的数据交互,具有良好的通用性与可拓展性,为相关应用开发提供了一种简洁实用的实现思路。

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QFile>
#include <QDebug>

void saveBmpToDatabase(const QString &imagePath, const QString &databasePath)
 {

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(databasePath);

    if (!db.open()) 
    {
        qDebug() << "无法打开数据库";
        return;
    }

    // 读取BMP图像文件
    QFile file(imagePath);
    if (!file.open(QIODevice::ReadOnly)) 
    {
        qDebug() << "无法打开图像文件";
        return;
    }

    QByteArray imageData = file.readAll();
    file.close();

    QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS Images (id INTEGER PRIMARY KEY, data BLOB)");

    query.prepare("INSERT INTO Images (data) VALUES (:data)");
    query.bindValue(":data", imageData);

    if (!query.exec())
    {
        qDebug() << "插入图像数据失败";
    } else 
    {
        qDebug() << "图像数据插入成功";
    }

    db.close();
}

int main(int argc, char *argv[]) 
{
    QCoreApplication a(argc, argv);

    QString imagePath = "a.bmp";
    QString databasePath = "image.db";

    saveBmpToDatabase(imagePath, databasePath);

    return a.exec();
}
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QFile>
#include <QDebug>

void loadBmpFromDatabase(const QString &outputPath, const QString &databasePath, int imageId)
 {

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(databasePath);

    if (!db.open()) 
    {
        qDebug() << "无法打开数据库";
        return;
    }

    QSqlQuery query;
    query.prepare("SELECT data FROM Images WHERE id = :id");
    query.bindValue(":id", imageId);

    if (!query.exec()) 
    {
        qDebug() << "读取图像数据失败";
        return;
    }

    if (query.next())
     {
        QByteArray imageData = query.value(0).toByteArray();

        QFile file(outputPath);
        if (!file.open(QIODevice::WriteOnly)) {
            qDebug() << "无法打开输出文件";
            return;
        }

        file.write(imageData);
        file.close();

        qDebug() << "图像已保存到" << outputPath;
    } else {
        qDebug() << "未找到指定的图像";
    }

    db.close();
}

int main(int argc, char *argv[]) 
{
    QCoreApplication a(argc, argv);

    QString outputPath = "b.bmp";
    QString databasePath = "image.db";
    int imageId = 1; 

    loadBmpFromDatabase(outputPath, databasePath, imageId);

    return a.exec();
}

相关文章:

  • WSL2 配置和离线安装linux系统。
  • 基础算法篇(5)(蓝桥杯常考点)—动态规划(C/C++)
  • PyCharm 开发工具 修改字体大小及使用滚轮没有反应
  • 【Wasserstein-1 距离】
  • Spring Boot + ShardingSphere 分库分表实战:电商订单场景案例
  • cline 提示词工程指南-架构篇
  • 美团即时零售大动作,将独立的闪购将会改变什么?
  • UE5 设置父物体和解除父子关系(移除子物体)
  • 磁珠详解:特性参数、选型方法、厂商对比及与电感的区别
  • 【动手学强化学习】番外6-MAPPO应用框架学习
  • QT开发之Mysql数据库(一)
  • 赶集网(Python)
  • C++ 指针从入门到精通实战:全面掌握指针的概念与应用
  • 第六讲 | vector的使用及其模拟实现
  • 绿算轻舟系列FPGA加速卡:驱动数字化转型的核心动力
  • 敏感数据触发后怎么保障安全?
  • Windows10 微软五笔 造词造句
  • 矩阵求导 Ref 0
  • 跨境电商中的几种支付方式——T/T、L/C、D/P、D/A、O/A
  • 【新能源汽车压力采集与数据处理技术方案:从传感器到智能分析的硬核实战指南】
  • 马上评|“AI神医宇宙”欺诈,连演员都不请了
  • 应勇:以法治力量服务黄河流域生态保护和高质量发展
  • 如何做大中国拳击产业的蛋糕?这项赛事给出办赛新思考
  • 上海嘉定远香文化环启用,运动、看展、听歌“一站式解决”
  • 美施压拉美国家选边站队,外交部:搞阵营对抗注定失败
  • 农贸美学、业态再构、智能管理,今天的菜市场不止有菜