基于Qt實(shí)現(xiàn)將BMP圖像數(shù)據(jù)存入SQLite數(shù)據(jù)庫
本項(xiàng)目通過 Qt 框架實(shí)現(xiàn)了將 BMP 圖像文件以二進(jìn)制形式存入 SQLite 數(shù)據(jù)庫,并可從數(shù)據(jù)庫中讀取還原為 BMP 圖像文件的功能,適用于需要圖像與結(jié)構(gòu)化數(shù)據(jù)統(tǒng)一管理的場景。
整個(gè)流程分為兩個(gè)主要部分:
一、圖像保存到數(shù)據(jù)庫
程序首先連接指定的 SQLite 數(shù)據(jù)庫,若數(shù)據(jù)庫文件不存在將自動創(chuàng)建。在讀取本地 BMP 圖像文件后,將其內(nèi)容作為二進(jìn)制數(shù)據(jù)(BLOB)保存至數(shù)據(jù)庫中的一張名為 Images 的數(shù)據(jù)表中。表結(jié)構(gòu)簡單,僅包含自增主鍵 id 和存儲圖像數(shù)據(jù)的 data 字段。若數(shù)據(jù)表尚未存在,程序會自動創(chuàng)建。
通過這種方式,圖像內(nèi)容不再依賴文件系統(tǒng)存儲,而是與應(yīng)用數(shù)據(jù)一同保存在數(shù)據(jù)庫中,有利于集中管理、版本控制與數(shù)據(jù)傳輸。
二、從數(shù)據(jù)庫讀取圖像并保存為文件
讀取部分通過指定圖像的 id 值從數(shù)據(jù)庫中查詢對應(yīng)的 BLOB 數(shù)據(jù),并將其以 BMP 格式寫入本地文件。程序在執(zhí)行過程中提供異常判斷,例如數(shù)據(jù)庫連接失敗、圖像記錄不存在、文件寫入失敗等,確保操作的穩(wěn)定性和可追蹤性。
三、應(yīng)用場景與擴(kuò)展性
該方案適用于圖像歸檔、數(shù)字資源管理、數(shù)據(jù)庫驅(qū)動的圖像瀏覽系統(tǒng)等場景。雖然本文示例以 BMP 圖像為主,但該方法同樣適用于任意格式的二進(jìn)制文件,如 PNG、JPG、PDF 等,只需調(diào)整文件處理部分即可。此外,數(shù)據(jù)庫結(jié)構(gòu)可擴(kuò)展,如添加圖像名稱、分類標(biāo)簽、時(shí)間戳等字段,實(shí)現(xiàn)更復(fù)雜的圖像管理系統(tǒng)。
本項(xiàng)目展示了如何將 Qt 與 SQLite 結(jié)合,實(shí)現(xiàn)圖像與數(shù)據(jù)庫之間的數(shù)據(jù)交互,具有良好的通用性與可拓展性,為相關(guān)應(yīng)用開發(fā)提供了一種簡潔實(shí)用的實(shí)現(xiàn)思路。
#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() << "無法打開數(shù)據(jù)庫";
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() << "插入圖像數(shù)據(jù)失敗";
} else
{
qDebug() << "圖像數(shù)據(jù)插入成功";
}
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() << "無法打開數(shù)據(jù)庫";
return;
}
QSqlQuery query;
query.prepare("SELECT data FROM Images WHERE id = :id");
query.bindValue(":id", imageId);
if (!query.exec())
{
qDebug() << "讀取圖像數(shù)據(jù)失敗";
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();
}
到此這篇關(guān)于基于Qt實(shí)現(xiàn)將BMP圖像數(shù)據(jù)存入SQLite數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)Qt圖像數(shù)據(jù)存入SQLite內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ vector擴(kuò)容解析noexcept應(yīng)用場景
這篇文章主要介紹了C++ vector擴(kuò)容解析noexcept應(yīng)用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
解決Microsoft?Visual?C++?2010?Express?運(yùn)行及調(diào)試問題
這篇文章主要介紹了解決Microsoft?Visual?C++?2010?Express?運(yùn)行及調(diào)試問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
淺析C語言中strtol()函數(shù)與strtoul()函數(shù)的用法
這篇文章主要介紹了淺析C語言中strtol()函數(shù)與strtoul()函數(shù)的用法,注意其將字符串轉(zhuǎn)換成long型的區(qū)別,需要的朋友可以參考下2015-08-08
C語言中返回錯(cuò)誤信息的相關(guān)函數(shù)用法總結(jié)
這篇文章主要介紹了C語言中返回錯(cuò)誤信息的相關(guān)函數(shù)用法總結(jié),包括strerror()函數(shù)和perror()函數(shù)以及ferror()函數(shù)的使用,需要的朋友可以參考下2015-09-09
VC++中HTControl的CHTButton按鈕控件類用法實(shí)例解析
這篇文章主要介紹了VC++中HTControl的CHTButton按鈕控件類用法,對于大家進(jìn)行VC++項(xiàng)目開發(fā)有一定的幫助作用,需要的朋友可以參考下2014-08-08
C++ normal_distribution高斯正態(tài)分布函數(shù)的用法示例
高斯分布也稱為正態(tài)分布(normal distribution),常用的成熟的生成高斯分布隨機(jī)數(shù)序列的方法由Marsaglia和Bray在1964年提出,這篇文章主要給大家介紹了關(guān)于C++ normal_distribution高斯正態(tài)分布函數(shù)用法的相關(guān)資料,需要的朋友可以參考下2021-07-07

