1. 程式人生 > >Qt顯示影象的類

Qt顯示影象的類

Qt 中沒有專門顯示圖片的控制元件,通常我們會使用QLabel來顯示圖片。但是QLabel 顯示圖片的能力還是有點弱。比如不支援影象的縮放一類的功能,使用起來不是很方便。因此我就自己寫了個簡單的類。

我這個類支援三種影象顯示模式,我分別稱之為:FIXED_SIZE, CENTRED,AUTO_ZOOM, AUTO_SIZE

  • FIXED_SIZE 模式下,顯示的影象大小等於影象尺寸乘以縮放因子,如果控制元件的尺寸小於這個大小則多出的部分被裁切掉。
  • FIX_SIZE_CENTRED模式與FIXED_SIZE 模式類似,但是,顯示的影象居於視窗正中。
  • AUTO_ZOOM 模式下,顯示的影象大小自動適應控制元件視窗大小。
  • AUTO_SIZE 模式下,這個控制元件的尺寸等於影象尺寸乘以縮放因子。

下面是程式碼:

  1. #ifndef PICTUREBOX_H
  2. #define PICTUREBOX_H
  3. #include <QWidget>
  4. #include <QImage>
  5. #include <QPixmap>
  6. class PictureBox : public QWidget  
  7. {      
  8.     Q_OBJECT  
  9. public:  
  10.     enum PB_MODE {FIXED_SIZE, FIX_SIZE_CENTRED, AUTO_ZOOM, AUTO_SIZE};  
  11.     explicit
     PictureBox(QWidget *parent = 0);  
  12.     void setMode(PB_MODE mode);  
  13.     ~PictureBox();  
  14. private:  
  15.     QPixmap m_pixmap;  
  16.     double m_scale;  
  17.     PB_MODE m_mode;  
  18.     QBrush m_brush;  
  19. protected:  
  20.     void paintEvent(QPaintEvent * event);  
  21. signals:  
  22. public slots:  
  23.     bool setImage(QImage &image, 
    double scale = 1.0);  
  24.     void setBackground(QBrush brush);  
  25. };  
  26. #endif // PICTUREBOX_H

  1. #include "picturebox.h"
  2. #include <QPainter>
  3. #include <QDebug>
  4. staticconstint IMAGE_WIDTH = 160;  
  5. staticconstint IMAGE_HEIGHT = 120;  
  6. staticconst QSize IMAGE_SIZE = QSize(IMAGE_WIDTH, IMAGE_HEIGHT);  
  7. PictureBox::PictureBox(QWidget *parent) : QWidget(parent)  
  8. {  
  9.     m_pixmap = QPixmap(IMAGE_SIZE);  
  10.     m_pixmap.fill();  
  11.     m_scale = 1.0;  
  12.     m_mode = FIXED_SIZE;  
  13.     m_brush = QBrush(Qt::white);  
  14. }  
  15. void PictureBox::setBackground(QBrush brush)  
  16. {  
  17.     m_brush = brush;  
  18.     update();  
  19. }  
  20. void PictureBox::setMode(PB_MODE mode)  
  21. {  
  22.     m_mode = mode;  
  23.     if(m_mode == AUTO_SIZE)  
  24.     {  
  25.         setFixedSize(m_pixmap.size() * m_scale);  
  26.     }  
  27.     else
  28.     {  
  29.         setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);  
  30.         setMinimumSize(0, 0);  
  31.     }  
  32.     update();  
  33. }  
  34. bool PictureBox::setImage(QImage &image, double scale)  
  35. {  
  36.     if(image.isNull())  
  37.     {  
  38.         returnfalse;  
  39.     }  
  40.     m_pixmap = QPixmap::fromImage(image);  
  41.     m_scale = qBound(0.01, scale, 100.0);  
  42.     if(m_mode == AUTO_SIZE)  
  43.     {  
  44.         setFixedSize(m_pixmap.size() * m_scale);  
  45.     }  
  46.     update();  
  47.     returntrue;  
  48. }  
  49. void PictureBox::paintEvent(QPaintEvent * event)  
  50. {  
  51.     Q_UNUSED(event);  
  52.     QPainter painter(this);  
  53.     painter.setBackground(m_brush);  
  54.     painter.eraseRect(rect());  
  55.     double window_width, window_height;  
  56.     double image_width, image_height;  
  57.     double r1, r2, r;  
  58.     int offset_x, offset_y;  
  59.     switch (m_mode)  
  60.     {  
  61.     case FIXED_SIZE:  
  62.     case AUTO_SIZE:  
  63.         painter.scale(m_scale, m_scale);  
  64.         painter.drawPixmap(0, 0, m_pixmap);  
  65.         break;  
  66.     case FIX_SIZE_CENTRED:  
  67.         window_width = width();  
  68.         window_height = height();  
  69.         image_width = m_pixmap.width();  
  70.         image_height = m_pixmap.height();  
  71.         offset_x = (window_width - m_scale * image_width) / 2;  
  72.         offset_y = (window_height - m_scale * image_height) / 2;  
  73.         painter.translate(offset_x, offset_y);  
  74.         painter.scale(m_scale, m_scale);  
  75.         painter.drawPixmap(0, 0, m_pixmap);  
  76.         break;  
  77.     case AUTO_ZOOM:  
  78.         window_width = width();  
  79.         window_height = height();  
  80.         image_width = m_pixmap.width();  
  81.         image_height = m_pixmap.height();  
  82.         r1 = window_width / image_width;  
  83.         r2 = window_height / image_height;  
  84.         r = qMin(r1, r2);  
  85.         offset_x = (window_width - r * image_width) / 2;  
  86.         offset_y = (window_height - r * image_height) / 2;  
  87.         painter.translate(offset_x, offset_y);  
  88.         painter.scale(r, r);  
  89.         painter.drawPixmap(0, 0, m_pixmap);  
  90.         break;  
  91.     }  
  92. }  
  93. PictureBox::~PictureBox()  
  94. {  
  95. }  

原文連結:

相關推薦

Qt顯示影象

Qt 中沒有專門顯示圖片的控制元件,通常我們會使用QLabel來顯示圖片。但是QLabel 顯示圖片的能力還是有點弱。比如不支援影象的縮放一類的功能,使用起來不是很方便。因此我就自己寫了個簡單的類。我這個類支援三種影象顯示模式,我分別稱之為:FIXED_SIZE, CENTR

QT讀取影象 顯示

1.在ui介面放置一個button,物件名稱為pushButton;放置一個label,名稱為imagelabel 2.標頭檔案 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainW

QT中圖表QChart系列之(7)-小結,chart中顯示曲線的標準步驟

在chart中建立曲線的標準步驟: 必須嚴格按以下步驟操作,否則會出現這樣那樣的顯示問題。寫法1: (1)建立chartView、chart、N個series、2個axis物件 (2)chart->setAxisX/Y() (3)chart->addSeries

Qt開發】QT顯示影象資料

一般影象資料都是以RGBRGBRGB……位元組流的方式(解碼完成後的原始影象流),我說成位元組流,那就表明R,G,B的值各佔一個位元組,在程式設計時表示的就是unsigned char * data。        我們先來看一下QT中的QImage物件。在載入data資料

QT顯示影象資料

一般影象資料都是以RGBRGBRGB……位元組流的方式(解碼完成後的原始影象流),我說成位元組流,那就表明R,G,B的值各佔一個位元組,在程式設計時表示的就是unsigned char * data。        我們先來看一下QT中的QImage物件。在載入data

[python] Kmeans文字聚演算法+PAC降維+Matplotlib顯示影象

0 前言 本文主要講述以下幾點:        1.通過scikit-learn計算文字內容的tfidf並構造N*M矩陣(N個文件 M個特徵詞);        2.呼叫scikit-learn中的K-means進行文字聚類;        3.使用PAC進行降維處理,每

Qt開發】Qt顯示影象的兩種方法對比

在Qt中處理圖片一般都要用到QImage類,但是QImage的物件不能夠直接顯示出來,要想能看到圖片,初步發現有兩種方法。 一、QImage轉QPixmap,然後用QLabel::setPixmap() image=new QImage("D:/Temp/XX.jpg

QT Label顯示影象

直接上程式碼: Mat srcImg; //////////////////////////// void MainWindow::paintEvent(QPaintEvent *e) { QImage image = QImage((uchar*)(srcImg

python實現Kmeans文字聚,通過PCA降維和Matplotlib顯示3d三維影象

首先感謝Eastmount寫的內容http://blog.csdn.net/Eastmount/article/details/50545937。點選開啟連結 在此基礎上,主要實現以下改進及結果 1.替換使用sklearn.feature_extraction.text.T

Qt影象顯示與基本操作

Qt可顯示基本的影象型別,利用QImage、QPxmap類可以實現影象的顯示,並且利用類中的方法可以實現影象的基本操作(縮放、旋轉)。 1. Qt可顯示的影象型別 參考Qt的幫助文件,可支援的型別,即可以直接讀取並顯示的格式有BMP、GIF、JPG、JPEG、PNG、

qt顯示灰度影象程式

I = imread("lena.jpg",0); qDebug( "my window %d%d", I.rows,I.cols); if(flag==1)

Qt 串口QSerialPort 使用筆記

keyword deb ria clip -m tools ror dal csdn Qt 串口類QSerialPort 使用筆記 雖然現在大多數的家用PC機上已經不提供RS232接口了。但是由於RS232串口操作簡單、通訊可靠,在工業領域中仍然有大量的應用。Qt以前的

QSet使用及Qt自定義型使用QHash等算法

算法 har 地址 node slc doc support ati tarray 版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址: 本文標題:QSet使用及Qt自定義類型使用QHash等算法 本文地址:http://

QT】常用

自動選擇 article 出現 pix 並且 win app 在屏幕上 部件 官方文檔 doc QWidget QWidget類是所有用戶界面對象的基類。 窗口部件是用戶界面的一個基本單元:它從窗口系統接收鼠標、鍵盤和其它事件,並且在屏幕上繪制自己。 每一個窗口部件

Qt數據型》--QByteArray,QString,int,hex之間的轉化

details strong AS CI bytearray 轉化 ascii 根據 SQ 對於QString和QByteArray,他們都有一個toInt的靜態函數,QString::toInt()是根據string的字面值轉化為int類型,比如string:"12

QT顯示中文 連接上文

bus 完成後 改變 chan 快速 little 開啟 庫文件 malloc 1.首先是建立Linux開發環境1.1.在windowsXP下安裝博創公司提供的虛擬機軟件VMware Workstation,版本為VMware-workstation-full-7.0.1-

Ubuntu下orbbec mini 無法正常顯示影象問題

最近用orbbec的深度攝像頭採集RGBD影象,Windows下一切OK。但是Ubuntu下出現了不少問題。總結一下 1、將裝置插到USB,先確定電腦能否正常識別裝置 Ubuntu下是不需要安裝驅動的(Windows下需要),因為Linux都有內建相應CMOS相機驅動。只需要設定一下udev進行相應的裝載

QT利用QSqlQuery執行SQL語句

參考網址:http://www.qter.org/forum.php?mod=viewthread&tid=6448 導語         SQL即結構化查詢語言,是關係資料庫的標準語言。前面兩節中已經在Qt裡利用QSq

QT---之QStringList常用方法

從QList <QString>繼承而來,它提供快速索引為基礎的接入以及快速插入和清除 其成員函式用於操作這個字串列表如 append(),insert(), replace(), removeAll(), removeAt(), removeFirst(), removeLast(),

Qt影象生成、輸入與輸出

#include "widget.h" #include <QApplication> #include <stdio.h> #include <opencv2/opencv.hpp> #include <QDebug> using namespa