最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Qt實(shí)現(xiàn)將BMP圖像數(shù)據(jù)存入SQLite數(shù)據(jù)庫(kù)

 更新時(shí)間:2025年06月26日 09:46:32   作者:XXYBMOOO  
這篇文章主要為大家詳細(xì)介紹了如何使用 Qt 框架實(shí)現(xiàn)了將 BMP 圖像文件以二進(jìn)制形式存入 SQLite 數(shù)據(jù)庫(kù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

本項(xiàng)目通過 Qt 框架實(shí)現(xiàn)了將 BMP 圖像文件以二進(jìn)制形式存入 SQLite 數(shù)據(jù)庫(kù),并可從數(shù)據(jù)庫(kù)中讀取還原為 BMP 圖像文件的功能,適用于需要圖像與結(jié)構(gòu)化數(shù)據(jù)統(tǒng)一管理的場(chǎng)景。

整個(gè)流程分為兩個(gè)主要部分:

一、圖像保存到數(shù)據(jù)庫(kù)

程序首先連接指定的 SQLite 數(shù)據(jù)庫(kù),若數(shù)據(jù)庫(kù)文件不存在將自動(dòng)創(chuàng)建。在讀取本地 BMP 圖像文件后,將其內(nèi)容作為二進(jìn)制數(shù)據(jù)(BLOB)保存至數(shù)據(jù)庫(kù)中的一張名為 Images 的數(shù)據(jù)表中。表結(jié)構(gòu)簡(jiǎn)單,僅包含自增主鍵 id 和存儲(chǔ)圖像數(shù)據(jù)的 data 字段。若數(shù)據(jù)表尚未存在,程序會(huì)自動(dòng)創(chuàng)建。

通過這種方式,圖像內(nèi)容不再依賴文件系統(tǒng)存儲(chǔ),而是與應(yīng)用數(shù)據(jù)一同保存在數(shù)據(jù)庫(kù)中,有利于集中管理、版本控制與數(shù)據(jù)傳輸。

二、從數(shù)據(jù)庫(kù)讀取圖像并保存為文件

讀取部分通過指定圖像的 id 值從數(shù)據(jù)庫(kù)中查詢對(duì)應(yīng)的 BLOB 數(shù)據(jù),并將其以 BMP 格式寫入本地文件。程序在執(zhí)行過程中提供異常判斷,例如數(shù)據(jù)庫(kù)連接失敗、圖像記錄不存在、文件寫入失敗等,確保操作的穩(wěn)定性和可追蹤性。

三、應(yīng)用場(chǎng)景與擴(kuò)展性

該方案適用于圖像歸檔、數(shù)字資源管理、數(shù)據(jù)庫(kù)驅(qū)動(dòng)的圖像瀏覽系統(tǒng)等場(chǎng)景。雖然本文示例以 BMP 圖像為主,但該方法同樣適用于任意格式的二進(jìn)制文件,如 PNG、JPG、PDF 等,只需調(diào)整文件處理部分即可。此外,數(shù)據(jù)庫(kù)結(jié)構(gòu)可擴(kuò)展,如添加圖像名稱、分類標(biāo)簽、時(shí)間戳等字段,實(shí)現(xiàn)更復(fù)雜的圖像管理系統(tǒng)。

本項(xiàng)目展示了如何將 Qt 與 SQLite 結(jié)合,實(shí)現(xiàn)圖像與數(shù)據(jù)庫(kù)之間的數(shù)據(jù)交互,具有良好的通用性與可拓展性,為相關(guān)應(yīng)用開發(fā)提供了一種簡(jiǎn)潔實(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ù)庫(kù)";
        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ù)庫(kù)";
        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ù)庫(kù)的文章就介紹到這了,更多相關(guān)Qt圖像數(shù)據(jù)存入SQLite內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 記一次ADL導(dǎo)致的C++代碼編譯錯(cuò)誤的原因及解決方法

    記一次ADL導(dǎo)致的C++代碼編譯錯(cuò)誤的原因及解決方法

    文章分析C++ ADL機(jī)制導(dǎo)致的print函數(shù)沖突,因<iostream>間接包含<print>頭文件,建議重命名或使用限定名稱解決,并強(qiáng)調(diào)IDE提示減少冗余頭文件以避免編譯問題,感興趣的朋友一起看看吧
    2025-07-07
  • C++實(shí)現(xiàn)管理系統(tǒng)的示例代碼

    C++實(shí)現(xiàn)管理系統(tǒng)的示例代碼

    這篇文章主要介紹了C++實(shí)現(xiàn)管理系統(tǒng)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • C++實(shí)現(xiàn)LeetCode(115.不同的子序列)

    C++實(shí)現(xiàn)LeetCode(115.不同的子序列)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(115.不同的子序列),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談C++中字符串輸入get與getline的區(qū)別

    淺談C++中字符串輸入get與getline的區(qū)別

    這篇文章主要介紹了C++中字符串輸入get與getline的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C++ find函數(shù)及用法小結(jié)

    C++ find函數(shù)及用法小結(jié)

    string類的find()函數(shù)用于在字符串中查找字符或子串,返回第一個(gè)匹配的位置,C++中的find()函數(shù)有多種用法,本文通過實(shí)例代碼給大家詳細(xì)講解,感興趣的朋友一起看看吧
    2023-12-12
  • OpenCV基于距離變換和分水嶺實(shí)現(xiàn)圖像分割

    OpenCV基于距離變換和分水嶺實(shí)現(xiàn)圖像分割

    圖像分割是根據(jù)灰度、顏色、紋理和形狀等特征,把圖像分成若干個(gè)特定的、具有獨(dú)特性質(zhì)的區(qū)域。本文將基于距離變換和分水嶺實(shí)現(xiàn)圖像分割,需要的可以了解一下
    2022-09-09
  • C語言實(shí)現(xiàn)斗地主的核心算法

    C語言實(shí)現(xiàn)斗地主的核心算法

    本文給大家分享的是使用C語言實(shí)現(xiàn)的斗地主游戲的核心算法,主要實(shí)現(xiàn)了面向?qū)ο笤O(shè)計(jì),洗牌、發(fā)牌、判斷牌型、比較牌的大小、游戲規(guī)則等算法。通過這個(gè)斗地主小項(xiàng)目的練習(xí),提高了我的面向?qū)ο笤O(shè)計(jì)能力,加深了對(duì)算法的理解。最近把這些設(shè)計(jì)和算法分享給大家。
    2015-03-03
  • C++ Boost Heap使用實(shí)例詳解

    C++ Boost Heap使用實(shí)例詳解

    Boost是為C++語言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • C++枚舉類型用法總結(jié)(枚舉字符常量代替常量)

    C++枚舉類型用法總結(jié)(枚舉字符常量代替常量)

    這篇文章主要介紹了C++枚舉類型用法總結(jié)(枚舉字符常量代替常量),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C語言時(shí)間處理從基礎(chǔ)獲取到高級(jí)應(yīng)用總結(jié)大全

    C語言時(shí)間處理從基礎(chǔ)獲取到高級(jí)應(yīng)用總結(jié)大全

    在C語言編程中,是一個(gè)非常重要的標(biāo)準(zhǔn)庫(kù),它提供了處理日期和時(shí)間的一系列函數(shù),這篇文章主要介紹了C語言時(shí)間處理從基礎(chǔ)獲取到高級(jí)應(yīng)用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-08-08

最新評(píng)論

延寿县| 永平县| 沧州市| 建宁县| 瑞金市| 抚顺县| 福建省| 上虞市| 玛多县| 宣城市| 广平县| 新密市| 西昌市| 安塞县| 布尔津县| 睢宁县| 武定县| 南丰县| 澄江县| 二连浩特市| 乌兰县| 寻乌县| 西安市| 茂名市| 休宁县| 登封市| 友谊县| 鄂温| 平山县| 余干县| 十堰市| 通辽市| 贡觉县| 东兰县| 抚宁县| 崇明县| 浙江省| 泸溪县| 驻马店市| 游戏| 望江县|