一般軟件加載顯示圖片的流程

目錄

1、一般圖片瀏覽軟件的流程(Qt 或類似框架):

1?? 讀取原始數據

2?? 解析圖片格式

3?? 存儲到內部可用的繪制對象

4?? 顯示到界面

? 總結

2、那什么叫“QPixmap 在 Qt 里就是“顯示專用的像素緩存”,不是原始壓縮文件,這句話什么意思

2?? 舉個比喻

3?? 為什么 Qt 這么做

3、如果想將sqlite3中存儲的圖片讀取出來,并顯示?

👌 這個需求可以分三步走:

從 SQLite 數據庫讀取圖片二進制數據(BLOB)

轉成 Qt 可用的 QPixmap/QImage

在控件里顯示(QLabel、paintEvent、QGraphicsView 等)

1. 假設數據庫中存儲了圖片

2. 在 Qt 中讀取 BLOB 數據

3. 關鍵點解釋

? 總結

4、Qt中?QPixmap和QImage有什么不同?

1. 核心區別

2. 為什么顯示用 QPixmap

3. 例子:兩者配合使用

4. 結論


1、一般圖片瀏覽軟件的流程(Qt 或類似框架):

1?? 讀取原始數據
  • 圖片文件存在磁盤上(PNG、JPG、BMP 等),瀏覽器需要先加載二進制數據

  • 方式:

    • 從文件系統讀取(常規圖片)

    • 從數據庫或網絡加載(BLOB / HTTP / FTP 等)

QByteArray data;
QFile file("cat.png");
file.open(QIODevice::ReadOnly);
data = file.readAll();

2?? 解析圖片格式
  • 根據文件頭(magic number)或文件擴展名識別格式:

    • PNG: 89 50 4E 47 0D 0A 1A 0A

    • JPG: FF D8 FF

  • 使用圖像庫(Qt 內置、libjpeg、libpng 等)把二進制數據解碼成像素信息。

QPixmap pix;
pix.loadFromData(data);  // Qt 自動識別格式并解碼

3?? 存儲到內部可用的繪制對象
  • QtQPixmap(硬件加速,顯示優化)

  • 像素處理軟件QImage(CPU 內存中,便于像素級操作)

  • 這一步的作用是把文件格式(壓縮、編碼)轉換成位圖像素,便于繪制。


4?? 顯示到界面
  • 使用 QPainter::drawPixmap()QLabel::setPixmap() 把像素顯示出來

  • Qt 會盡量用顯卡加速渲染,提高顯示效率

  • 如果圖片縮放、旋轉,也是在這個階段處理。

label->setPixmap(pix.scaled(label->size(), Qt::KeepAspectRatio));

? 總結
  • 瀏覽器或圖片查看器基本都是這個流程:
    文件 / 網絡 / 數據庫 → 讀取二進制 → 解碼成像素 → 顯示

  • QPixmap 在 Qt 里就是**“顯示專用的像素緩存”**,不是原始壓縮文件

  • 原格式信息(PNG、JPG)在顯示時已經不重要了,除非你要保存或導出

2、那什么叫“QPixmap 在 Qt 里就是“顯示專用的像素緩存”,不是原始壓縮文件,這句話什么意思

1?? 原始壓縮文件 VS 像素緩存

  • 原始壓縮文件

    • 例如 cat.pngdog.jpg

    • 文件在磁盤上存儲的是 壓縮編碼的數據,不是直接的像素。

      • PNG 用 DEFLATE 壓縮 + 顏色索引

      • JPG 用 DCT + 有損壓縮

    • 文件本身并不是每個像素的顏色值,而是經過壓縮、編碼過的。

    • 讀取這個文件需要 解碼 才能得到真正的像素顏色信息。

  • 像素緩存(QPixmap)

    • QPixmap 內部存儲的是 解碼后的每個像素的顏色值(RGBA 或 RGB)。

    • 就是屏幕上顯示的原始像素數據,已經不再是 PNG/JPG 壓縮格式。

    • Qt 可以直接把這些像素交給顯卡渲染,不需要再解碼。


2?? 舉個比喻

想象一下:

  • 原始文件 = 一本壓縮過的書(壓縮包)

  • 解壓后的像素緩存(QPixmap) = 打開壓縮包后的書頁,文字/圖片已經完整展開

  • 屏幕顯示 = 把書頁貼到墻上展示

你不能直接把壓縮包貼到墻上看(顯示不了內容),必須先解壓。QPixmap 就是“解壓后的內容,專門為顯示準備的”。


3?? 為什么 Qt 這么做

  • 顯示圖片時,如果每次都去解壓 PNG/JPG,會非常慢。

  • QPixmap 把像素緩存在顯存里,繪制時直接交給 GPU → 渲染速度快。

  • 它是 顯示專用,不是文件的存儲形式,所以修改 QPixmap 并不會改變原文件。


💡 總結

QPixmap ≈ “已經解碼好的像素緩存”,用于顯示
PNG/JPG 文件 ≈ “壓縮編碼文件”,用于存儲
兩者存儲內容和用途不同

所以,我們平時使用圖片查看器看到的圖像都是解壓后的數據呈現的像素效果。

3、如果想將sqlite3中存儲的圖片讀取出來,并顯示?

👌 這個需求可以分三步走:
  1. 從 SQLite 數據庫讀取圖片二進制數據(BLOB)
  2. 轉成 Qt 可用的 QPixmap/QImage
  3. 在控件里顯示(QLabel、paintEvent、QGraphicsView 等)

1. 假設數據庫中存儲了圖片

SQLite 表結構可能是這樣的:

CREATE TABLE images (id INTEGER PRIMARY KEY,name TEXT,data BLOB
);

存的時候一般是用二進制流寫進去。


2. 在 Qt 中讀取 BLOB 數據

使用 QSqlQuery 取出數據,再轉成 QByteArrayQPixmap

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QDebug>
#include <QPixmap>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>class ImageWidget : public QWidget {Q_OBJECT
public:ImageWidget(QWidget *parent = nullptr) : QWidget(parent) {QVBoxLayout *layout = new QVBoxLayout(this);QLabel *label = new QLabel(this);layout->addWidget(label);// 1. 打開數據庫QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("mydata.db");if (!db.open()) {qDebug() << "數據庫打開失敗:" << db.lastError().text();return;}// 2. 查詢 BLOBQSqlQuery query("SELECT data FROM images WHERE id=1");if (query.next()) {QByteArray blob = query.value(0).toByteArray();// 3. 轉 QPixmapQPixmap pix;pix.loadFromData(blob);// 4. 顯示在 QLabellabel->setPixmap(pix.scaled(300, 300, Qt::KeepAspectRatio));} else {qDebug() << "未找到記錄";}}
};

3. 關鍵點解釋
  • QByteArray blob = query.value(0).toByteArray();
    SQLite 里存的 BLOB → 直接轉 QByteArray。

  • pix.loadFromData(blob)
    Qt 會自動根據圖片頭(PNG/JPG/BMP 等)解析格式。

  • 顯示
    最簡單的是用 QLabel::setPixmap(),也可以在 paintEvent 里用 QPainter::drawPixmap()


? 總結
  • SQLite 里存圖片 → BLOB 類型

  • 取出后用 QPixmap::loadFromData() 轉換

  • QLabelQPainter 繪制

4、Qt中?QPixmap和QImage有什么不同?

1. 核心區別
特性QPixmapQImage
存儲方式依賴底層圖形系統(GPU/顯存加速)存在內存中(CPU 管理的像素數組)
優化方向顯示優化(繪制到屏幕最快)像素級操作優化(修改、訪問像素快)
典型用途用于繪制 UI、顯示圖片、圖標圖像處理(濾鏡、像素修改、OCR 前處理)
線程安全GUI 線程專用(不能在非 GUI 線程創建/使用)可在非 GUI 線程使用
轉換方式可由 QImage 轉換而來可由 QPixmap 轉換而來

2. 為什么顯示用 QPixmap
  • QPixmap 會把圖像數據交給底層圖形系統(X11、Windows GDI、OpenGL、Raster),顯示時 直接調用顯卡加速,效率很高。

  • QImage 是存在普通內存里的,繪制時要先拷貝到顯存,顯示性能差很多

  • 因此 Qt 官方建議:

    • 顯示/繪制 → QPixmap

    • 處理/計算 → QImage


3. 例子:兩者配合使用

比如從 SQLite 讀出一張 BLOB:

QByteArray blob = query.value(0).toByteArray();
QImage img;
img.loadFromData(blob);          // 先用 QImage 讀出來
QPixmap pix = QPixmap::fromImage(img);  // 轉換成 QPixmap
label->setPixmap(pix);           // 顯示

如果要對圖像做濾波、灰度化之類的操作,就在 QImage 階段完成,最后再轉成 QPixmap


4. 結論
  • 顯示(UI、繪制到屏幕)→ 用 QPixmap

  • 處理(圖像計算、像素訪問)→ 用 QImage

  • 兩者可以互相轉換,實際項目里經常配合使用。

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

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

相關文章

【論文閱讀】REFRAG:一個提升RAG解碼效率的新思路

引言 看到一則報道[1]&#xff0c;重組后的Meta實驗室在9月1號發布了一篇關于提升RAG解碼效率的論文&#xff0c;提出的思路有點啟發作用&#xff0c;于是把原文下載下來仔細看下。 論文標題&#xff1a;REFRAG: Rethinking RAG based Decoding 論文地址&#xff1a;https://ar…

QT M/V架構開發實戰:QFileSystemModel介紹

目錄[TOC](目錄)前言一、QFileSystemModel初步介紹二、基本功能1.創建2.基本屬性與方法三、示例&#xff08;簡單的文件瀏覽器&#xff09;四、性能注意事項前言 本文主要介紹的是使用代碼生成的情況下對控件的介紹&#xff0c;包括擁有的功能及能修改的樣式&#xff0c;也會說…

視頻生成迎來效率革命!字節提出視頻生成稀疏注意力機制,計算量降20倍,速度升17.79倍!

論文鏈接&#xff1a;https://arxiv.org/pdf/2509.01085亮點直擊BSA——一種可訓練的雙向動態稀疏注意力框架&#xff0c;該框架首次在視頻擴散訓練中對全注意力機制中的查詢&#xff08;Query&#xff09;及鍵值對&#xff08;Key-Value&#xff09;進行正交稀疏化處理以加速訓…

STM32HAL庫_cubeMX

ADC簡介STM32f103的是12位逼近型ADC代碼連續非掃描模式&#xff08;1個通道&#xff09;1&#xff1a;校準ADC&#xff08;這個可要可不要&#xff09;2&#xff1a;ADC初始化3&#xff1a;配置ADC通道&#xff08;這個函數只有一個通道時就是可要可不要&#xff09;4&#xff…

【Qt】清空QDateTimeEdit

代碼 ui->startDate->setSpecialValueText(" "); //這里是空格 ui->startDate->setMinimumDate(QDate(2024, 1, 1)); ui->startDate->setDate(QDate::fromString("2024-01-01", "yyyy-MM-dd"));原理 設置特殊值顯示文本&#…

LiTS 2017 datasets

下載記錄 論文地址&#xff1a;https://doi.org/10.1016/j.media.2022.102680 官方下載鏈接&#xff1a;https://competitions.codalab.org/competitions/17094 進入鏈接后&#xff0c;需要先注冊才能拿到下載點擊Train data下面的Mirro1&#xff0c;在google云盤會看到Trai…

kafka3.8集群搭建

kafka集群需要三臺機器搭建&#xff0c;并使用內置zookeeperIP10.0.0.110.0.0.210.0.0.3安裝jdk # ubuntu sudo apt install -y openjdk-8-jdk-headless # centos sudo yum install -y java-1.8.0-openjdk下載kafka wget https://archive.apache.org/dist/kafka/3.8.1/kafka_2…

從15kHz 到20MHz:為什么LTE帶寬不能被子載波間隔整除?

從 15 kHz 到 20 MHz&#xff1a;為什么 LTE 帶寬不能被子載波間隔整除&#xff1f; 1. 引言 在 LTE 系統中&#xff0c;子載波間隔被固定為 15 kHz&#xff0c;而系統帶寬卻被設計為 1.4、3、5、10、15、20 MHz 六個檔位。乍一看&#xff0c;這些帶寬似乎無法被 15 kHz 整除&a…

html css js網頁制作成品——HTML+CSS娃娃店網頁設計(4頁)附源碼

目錄 一、?????網站題目 二、??網站描述 三、??網站介紹 四、??網站效果 五、?? 代碼實現 ??HTML

【計算機網絡 | 第15篇】動態主機配置協議

文章目錄為何需要DHCP&#xff1f;手動配置的痛點&#x1f914;DHCP的基本工作模式&#x1f95d;DHCP的核心功能&#xff1a;IP地址的動態管理&#x1f95d;租用期的特點租用期的管理機制DHCP四步工作流程&#xff1a;從“發現”到“綁定”&#x1f426;?&#x1f525;中繼代理…

嵌入式系統內存分段核心內容詳解

一、嵌入式內存分段整體規則&#xff08;按地址從低到高&#xff09;嵌入式系統內存按 “功能 屬性” 劃分為 6 個核心段&#xff0c;地址從低到高依次分布&#xff0c;各段職責與存儲對象明確&#xff0c;具體規則如下表&#xff1a;地址范圍段類型&#xff08;Segment&#…

開發避坑指南(45):Java Stream 求兩個List的元素交集

需求 java 中如何用stream求兩個List元素的交集&#xff1f; 代碼實現 直接上代碼 public class ListTest {public static void main(String[] args) {List<Integer> list1 new ArrayList<>();list1.add(1);list1.add(2);list1.add(3);List<Integer> list2 …

gitlab流水線與k8s集群的聯通

gitlab流水線與k8s集群的連接&#xff0c;首先是通過gitlab-ci.yml文件中的命令&#xff0c;通過runner執行器實例運行對應的kubectl命令實現的。 那么runner執行器實例執行器如何執行kubectl命令&#xff0c;執行環境的配置&#xff0c;kubectl命令如何與k8s集群互認&#xff…

【Linux】常用命令速查表

Linux 常用命令速查表查看進程內存映射pmap -x <pid> # 查看進程的內存映射信息查看系統架構uname -m # 查看操作系統架構&#xff08;x86_64 / arm64 等&#xff09;磁盤與文件du -sh /home/* # 查看 /home 下每個用戶目錄的大小&#x…

Windows下編譯SLEPc

本文記錄在Windows下編譯SLEPc的流程。 零、環境 操作系統Windows 11VS Code1.92.1MSYS2msys2-x86_64-20250830 一、安裝依賴 1.1、依賴 首先&#xff0c;下載并安裝MSYS2&#xff0c; 打開MSYS2 MINGW64控制臺&#xff0c;運行以下命令安裝依賴包&#xff0c; pacman -S …

運動生理實驗室解決方案 人體生理實驗整體解決方案

&#xff08;一&#xff09;、硬件參數 集成化折疊式無創型生理實驗平臺&#xff1a;1.1、 集成化設計:至少包含設備操作臺、可收納式交互實驗桌、可收納式檢查床、生物信號 采集處理系統、計算機工作站集成于一體的高度集成設計&#xff1b;&#xff08;o561-6o623…

Axure RP 9 最新版安裝包+安裝步驟Win系統適用(附安裝包)

Axure RP 9? 是一款專業的 ?原型設計工具&#xff0c;主要用于 ?網站、APP、軟件等產品的界面設計和交互原型制作。 一、準備工作 ?下載好安裝包? Axure RP 9安裝包下載&#xff1a;https://pan.quark.cn/s/bc2b35011106 二、開始安裝 第一步&#xff1a;雙擊運行安裝包…

AutoMQ 亮相首爾:KafkaKRU 分享日志流處理新思路

全球 Kafka 社區都在關注 AutoMQ&#xff01;憑借在 Kafka 生態的獨特創新&#xff0c;AutoMQ 深受 Kafka 用戶喜愛&#xff0c;已成為眾多企業和開發者的首選實時數據解決方案。昨天&#xff0c;我們非常高興看到來自韓國的 KafkaKRU 核心社區在首爾舉辦第2屆官方線下交流會。…

從零開始使用 axum-server 構建 HTTP/HTTPS 服務

axum-server 是 Rust 生態中為 axum 框架設計的高性能服務器實現&#xff0c;基于 hyper&#xff08;底層 HTTP 引擎&#xff09;和 tower&#xff08;服務抽象&#xff09;構建&#xff0c;支持 HTTP/1、HTTP/2 及 HTTPS。本教程將從環境準備到實戰功能&#xff0c;一步步帶你…

電路運行的核心-RTC

1. 時鐘芯片是什么&#xff1f;時鐘芯片&#xff0c;更準確的名稱是實時時鐘芯片&#xff0c;英文是 Real-Time Clock&#xff0c;簡稱 RTC。它是一個專用的集成電路&#xff0c;其核心功能是追蹤時間和日歷。你可以把它想象成電子設備里的一個“電子表”或“日歷鐘”。關鍵特性…