基于 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();
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76776.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式基礎(三)基礎外設

嵌入式基礎&#xff08;三&#xff09;基礎外設 1.什么是UART&#xff1f;與USART有什么區別??? (1)什么是UART 通用異步收發傳輸器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常稱作UART。是一種異步全雙工串行通信協議&#xff0c;它將要…

人力資源管理方向論文怎么寫?

目錄 一、人力資源管理方向論文選題 二、人力資源管理方向論文參考資料 隨著經濟的蓬勃發展&#xff0c;企業日益意識到引才、善用人才、留住人才對于業務發展的至關重要性。人力資源管理逐漸成為企業管理中的核心職能&#xff0c;其角色日益凸顯。近年來&#xff0c;“人力資…

機器學習 從入門到精通 day_05

1. 線性回歸 前面介紹了很多分類算法&#xff0c;分類的目標變量是標稱型數據&#xff0c;回歸是對連續型的數據做出預測。 標稱型數據&#xff08;Nominal Data&#xff09;是統計學和數據分析中的一種數據類型&#xff0c;它用于分類或標記不同的類別或組別,數據點之間并沒有…

神經子圖同構計數

摘要 本文研究了一個新的圖學習問題&#xff1a;學習計算子圖同構。與其他傳統的圖學習問題&#xff0c;如節點分類和鏈接預測不同&#xff0c;子圖同構計數是NP完全的&#xff0c;需要更多的全局推理來監督整個圖。為了使其可擴展為大規模的圖形和模式&#xff0c;我們提出了一…

開源模型應用落地-模型上下文協議(MCP)-第三方MCP Server實戰指南(五)

一、前言 在AI技術高速發展的2025年,如何讓大語言模型(LLM)更靈活地調用外部工具與數據,成為開發者關注的焦點。?模型上下文協議(MCP)?作為AI與外部資源的“萬能接口”,通過標準化交互框架解決了傳統集成中的碎片化問題。而第三方MCP Server的引入,進一步降低了開發門…

【2025年認證杯數學中國數學建模網絡挑戰賽】C題 數據預處理與問題一二求解

目錄 【2025年認證杯數學建模挑戰賽】C題數據預處理與問題一求解三、數據預處理及分析3.1 數據可視化3.2 滑動窗口相關系數統計與動態置信區間耦合分析模型3.3 耦合關系分析結果 四、問題一代碼數據預處理問題一 【2025年認證杯數學建模挑戰賽】C題 數據預處理與問題一求解 三…

AI Agent開發大全第二十八課-MCP實現本地命令調用怎么做的?

開篇 MCP很強大,Client端一旦實現了穩定的連接和執行流程后任Server端隨意改動都可兼容,這就是熱插撥功能。 如果我們僅僅滿足于MCP查點網上資料、讀點圖片即文字型的功能肯定是不能充分發揮MCP的強大之處的,正應了Google以及Anthropic最近的研究報告上說的:不要再在chat…

AJAX原理與XMLHttpRequest

目錄 一、XMLHttpRequest使用步驟 基本語法 步驟 1&#xff1a;創建 XHR 對象 步驟 2&#xff1a;調用 open() 方法 步驟 3&#xff1a;監聽 loadend 事件 步驟 4&#xff1a;調用 send() 方法 二、完整示例 1. GET 請求&#xff08;帶查詢參數&#xff09; 2. POST 請…

python寫個0~12個月寶寶喂養規劃表

下載字體&#xff1a;https://github.com/adobe-fonts/source-han-sans/releases 下載fpdf2 pip uninstall fpdf pip install fpdf2運行代碼 ?from fpdf import FPDF from fpdf.enums import XPos, YPos# 創建 PDF 類 class BabyFeedingPDF(FPDF):def header(self):self.s…

集中趨勢描述

一、集中趨勢的定義與核心目標 集中趨勢指數據向其中心值聚集的傾向,反映數據的典型水平或分布中心。其核心是通過統計指標(如眾數、中位數、均值)概括數據的核心特征,幫助快速理解數據分布的核心位置。 核心作用:簡化復雜數據、指導業務決策(如確定用戶平均消費水平)、…

【NLP】Attention機制

1.模型對比 RNN(馬爾科夫鏈式編碼) 通過遞歸計算逐個處理 token,當前編碼結果 h t h_t ht?僅依賴前一步的隱藏狀態 h t ? 1 h_{t-1} ht?1?和當前輸入 x t x_t xt?局限性:序列建模需嚴格串行,無法并行;長距離依賴易丟失(梯度消失/爆炸)例:雙向 LSTM 需正向+反向兩…

基于OpenCV與PyTorch的智能相冊分類器全棧實現教程

引言&#xff1a;為什么需要智能相冊分類器&#xff1f; 在數字影像爆炸的時代&#xff0c;每個人的相冊都存儲著數千張未整理的照片。手動分類不僅耗時&#xff0c;還容易遺漏重要瞬間。本文將手把手教你構建一個基于深度學習的智能相冊分類系統&#xff0c;實現&#xff1a;…

活動安排問題 之 前綴和與差分

文章目錄 D. Robert Hood and Mrs Hood 考慮到一個活動開始時間和結束時間s,e&#xff0c;那么可以影響到的范圍就是 s-d1,e,所以我們只需對這個每一個活動可以影響到的區域進行標記即可&#xff0c;當然為了降低時間復雜度&#xff0c;我們將使用前綴和與差分 t int(input()…

C++之 多繼承

在學校里有老師和學生&#xff0c;他們都是人&#xff0c;我么應該創建一個名為 Person 的基類和兩個名為 Teacher 和Student 的子類&#xff0c;后兩者是從前者繼承來的 有一部分學生還教課掙錢&#xff08;助教&#xff09;&#xff0c;也就是同時存在著兩個”是一個”關系&…

大數據學習棧記——Redis安裝及其使用

本文介紹NoSQL技術&#xff1a;Redis的安裝及其使用。操作系統&#xff1a;Ubuntu24.04 Redis介紹 Redis是一個鍵值&#xff08;key-value&#xff09;存儲系統&#xff0c;即鍵值對非關系型數據庫&#xff0c;和Memcached類似&#xff0c;目前正在被越來越多的互聯網公司采用…

2024團體程序設計天梯賽L3-1 奪寶大賽

L3-037 奪寶大賽 分數 30 作者 陳越 單位 浙江大學 奪寶大賽的地圖是一個由 nm 個方格子組成的長方形&#xff0c;主辦方在地圖上標明了所有障礙、以及大本營寶藏的位置。參賽的隊伍一開始被隨機投放在地圖的各個方格里&#xff0c;同時開始向大本營進發。所有參賽隊從一個方格…

JMeter的高并發和高頻率和分布式

性能測試 模擬各種正常的、峰值的測試環境&#xff0c;檢測程序的各項性能指標是否能夠達標 高并發 JMeter中內置了定時器&#xff0c;可以實現時間模式相關的性能測試 需求1:同一時刻100個同學去訪問學生管理系統的查詢所有學院信息功能&#xff0c;統計高并發情況下平均響…

ubuntu學習day2

linux常用命令 3.文件查看及處理命令 3.1查看文件內容 cat[選項][文件] -b 對非空輸出行編號 -E 在每行結束處顯示$ -n 對輸出的所有行編號 -s 不輸出多行空行 標準輸入、標準輸出和標準錯誤 在 Linux 中&#xff0c;每個進程默認有三個文件描述符&#xff1a; 標準輸入&…

項目中引入 Redis 及 常用五種數據類型

在平常的開發過程中&#xff0c;我們經常會用到緩存的技術。比如&#xff0c;驗證碼60秒后過期、計數器的實現、商品信息存儲在緩存中快速展示等。那么&#xff0c;項目中經常會使用到的便是 redis 緩存。redis 在內存中操作&#xff0c;讀寫快。Redis 常用的數據類型有五種&am…

Spark-SQL簡介及核心編程

Spark-SQL概述&#xff1a;是Spark用于結構化數據處理的模塊&#xff0c;前身是Shark。Shark基于Hive開發&#xff0c;使SQL-on-Hadoop性能大幅提升&#xff0c;但對Hive依賴制約了Spark發展。SparkSQL汲取Shark優點并重新開發&#xff0c;在數據兼容、性能優化和組件擴展上優勢…