基于Qt实现将BMP图像数据存入SQLite数据库

 更新时间:2025年06月26日 09:46:32   作者:XXYBMOOO  
这篇文章主要为大家详细介绍了如何使用 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();
}

 到此这篇关于基于Qt实现将BMP图像数据存入SQLite数据库的文章就介绍到这了,更多相关Qt图像数据存入SQLite内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 记一次ADL导致的C++代码编译错误的原因及解决方法

    记一次ADL导致的C++代码编译错误的原因及解决方法

    文章分析C++ ADL机制导致的print函数冲突,因<iostream>间接包含<print>头文件,建议重命名或使用限定名称解决,并强调IDE提示减少冗余头文件以避免编译问题,感兴趣的朋友一起看看吧
    2025-07-07
  • C++实现管理系统的示例代码

    C++实现管理系统的示例代码

    这篇文章主要介绍了C++实现管理系统的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • C++实现LeetCode(115.不同的子序列)

    C++实现LeetCode(115.不同的子序列)

    这篇文章主要介绍了C++实现LeetCode(115.不同的子序列),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 浅谈C++中字符串输入get与getline的区别

    浅谈C++中字符串输入get与getline的区别

    这篇文章主要介绍了C++中字符串输入get与getline的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • C++ find函数及用法小结

    C++ find函数及用法小结

    string类的find()函数用于在字符串中查找字符或子串,返回第一个匹配的位置,C++中的find()函数有多种用法,本文通过实例代码给大家详细讲解,感兴趣的朋友一起看看吧
    2023-12-12
  • OpenCV基于距离变换和分水岭实现图像分割

    OpenCV基于距离变换和分水岭实现图像分割

    图像分割是根据灰度、颜色、纹理和形状等特征,把图像分成若干个特定的、具有独特性质的区域。本文将基于距离变换和分水岭实现图像分割,需要的可以了解一下
    2022-09-09
  • C语言实现斗地主的核心算法

    C语言实现斗地主的核心算法

    本文给大家分享的是使用C语言实现的斗地主游戏的核心算法,主要实现了面向对象设计,洗牌、发牌、判断牌型、比较牌的大小、游戏规则等算法。通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算法的理解。最近把这些设计和算法分享给大家。
    2015-03-03
  • C++ Boost Heap使用实例详解

    C++ Boost Heap使用实例详解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C++枚举类型用法总结(枚举字符常量代替常量)

    C++枚举类型用法总结(枚举字符常量代替常量)

    这篇文章主要介绍了C++枚举类型用法总结(枚举字符常量代替常量),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C语言时间处理从基础获取到高级应用总结大全

    C语言时间处理从基础获取到高级应用总结大全

    在C语言编程中,是一个非常重要的标准库,它提供了处理日期和时间的一系列函数,这篇文章主要介绍了C语言时间处理从基础获取到高级应用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-08-08

最新评论