日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Qt】2D绘图之绘制图像(二)

發(fā)布時間:2024/4/24 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Qt】2D绘图之绘制图像(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 概述
    • 02. 開發(fā)環(huán)境
    • 03. 繪制QImage圖像
    • 04. 繪制QPixmap圖像
    • 05. 繪制QPicture圖像
    • 06. 綜合對比
    • 07. 附錄

01. 概述

Qt提供了四個類來處理圖像數(shù)據(jù):QImage、QPixmap、QBitmap和QPicture,它們也都是常用的繪圖設(shè)備。

  • QImage主要用來進行I/O處理,它對I/O處理操作進行了優(yōu)化,而且也可以用來直接訪問和操作像素;
  • QPixmap主要用來在屏幕上顯示圖像,它對在屏幕上顯示圖像進行了優(yōu)化;
  • QBitmap是QPixmap的子類,它是一個便捷類,用來處理顏色深度為1的圖像,即只能顯示黑白兩種顏色;
  • QPicture用來記錄并重演QPainter命令。

02. 開發(fā)環(huán)境

Windows系統(tǒng):Windows10

Qt版本:Qt5.15或者Qt6

03. 繪制QImage圖像

QImage類提供了一個與硬件無關(guān)的圖像表示方法,可以直接訪問像素數(shù)據(jù),也可以作為繪圖設(shè)備。

因為QImage是QPaintDevice的子類,所以QPainter可以直接在QImage對象上進行繪制。當在QImage上使用QPainter時,繪制操作會在當前GUI線程以外的其他線程中執(zhí)行。

QImage支持的圖像格式包含了單色、8位、32位和alpha混合格式圖像。QImage提供了獲取圖像各種信息的相關(guān)函數(shù),還提供了一些轉(zhuǎn)換圖像的函數(shù)。

QImage使用了隱式數(shù)據(jù)共享,所以可以進行值傳遞,QImage對象還可以使用數(shù)據(jù)流或者進行比較。

Qt支持的圖像格式

程序示例

void Widget::paintEvent(QPaintEvent *) {QPainter painter(this);QImage image;//加載一張圖片image.load(":/image/a.png");//輸出圖片相關(guān)信息qDebug() << image.size() << " " << image.format() << " " << image.depth();//在界面上繪制圖片painter.drawImage(QPoint(10, 10), image);//獲取鏡像圖片QImage mirror = image.mirrored();//將圖片進行扭曲QTransform transform;transform.shear(0.2, 0);QImage image2 = mirror.transformed(transform);painter.drawImage(QPoint(10, 160), image2);//將圖片保存到當前文件中image2.save("./mirror.png"); }

運行結(jié)果

04. 繪制QPixmap圖像

QPixmap可以作為一個繪圖設(shè)備將圖像顯示在屏幕上。QPixmap中的像素在內(nèi)部由底層的窗口系統(tǒng)來進行管理。因為QPixmap是QPaintDevice的子類,所以QPainter也可以直接在它上面進行繪制。要想訪問像素,只能使用QPainter的相應函數(shù),或者將QPixmap轉(zhuǎn)換為QImage。而與QImage不同,QPixmap中的fill()函數(shù)可以使用指定的顏色初始化整個pixmap圖像。

可以使用toImage()和fromImage()函數(shù)在QImage和QPixmap之間進行轉(zhuǎn)換。通常情況下,QImage類用來加載一個圖像文件,隨意操縱圖像數(shù)據(jù),然后將QImage對象轉(zhuǎn)換為QPixmap類型再顯示到屏幕上。當然,如果不需要對圖像進行操作,那么也可以直接使用QPixmap來加載圖像文件。與QImage不同,QPixmap依賴于具體的硬件。QPixmap類也是使用隱式數(shù)據(jù)共享,可以作為值進行傳遞。

QPixmap可以很容易的使用QLabel或QAbstractButton的子類(比如QPushButton)來顯示在屏幕上。QLabel擁有一個pixmap屬性,而QAbstractButton擁有一個icon屬性。我們還可以使用grabWidget()和grabWindow()等靜態(tài)函數(shù)來實現(xiàn)截屏功能,使用mask()等函數(shù)實現(xiàn)遮罩效果。

程序示例

void Widget::paintEvent(QPaintEvent *) {QPainter painter(this);QPixmap pix;pix.load(":/image/b.png");painter.drawPixmap(0, 0, pix.width(), pix.height(), pix);painter.setBrush(QColor(255, 255, 255, 100));painter.drawRect(0, 0, pix.width(), pix.height());painter.drawPixmap(100, 0, pix.width(), pix.height(), pix);painter.setBrush(QColor(0, 0, 255, 100));painter.drawRect(100, 0, pix.width(), pix.height());}

運行結(jié)果

05. 繪制QPicture圖像

QPicture是一個可以記錄和重演QPainter命令的繪圖設(shè)備。QPicture可以使用一個平臺無關(guān)的格式(.pic格式)將繪圖命令序列化到IO設(shè)備中,所有可以繪制在QWidget部件或者QPixmap上的內(nèi)容,都可以保存在QPicture中。QPicture與分辨率無關(guān),在不同設(shè)備上的顯示效果都是一樣的。要記錄QPainter命令,可以像如下代碼這樣進行:

void Widget::paintEvent(QPaintEvent *) {QPicture picture;QPainter painter;//記錄Qpainter命令painter.begin(&picture);painter.drawEllipse(10, 20, 80, 70);painter.end();picture.save("draw.pic");//重演QPainter命令picture.load("draw.pic");painter.begin(this);painter.drawPicture(0, 0, picture);painter.end();}

運行結(jié)果

06. 綜合對比

程序示例

void Widget::paintEvent(QPaintEvent *) {QPainter painter(this);//繪制imageQImage image(100, 100, QImage::Format_ARGB32);painter.begin(&image);painter.setPen(QPen(Qt::green, 3));painter.setBrush(Qt::yellow);painter.drawRect(10, 10, 60, 60);painter.drawText(10, 10, 60, 60, Qt::AlignCenter, tr("Image"));painter.setBrush(QColor(0, 0, 0, 100));painter.drawRect(50, 50, 40, 40);painter.end();//繪制pixmapQPixmap pixMap(100, 100);painter.begin(&pixMap);painter.setPen(QPen(Qt::green, 3));painter.setBrush(Qt::yellow);painter.drawRect(10, 10, 60, 60);painter.drawText(10, 10, 60, 60, Qt::AlignCenter, tr("Pixmap"));painter.setBrush(QColor(0, 0, 0, 100));painter.drawRect(50, 50, 40, 40);painter.end();//繪制bitmapQBitmap bitMap(100, 100);painter.begin(&bitMap);painter.setPen(QPen(Qt::green, 3));painter.setBrush(Qt::yellow);painter.drawRect(10, 10, 60, 60);painter.drawText(10, 10, 60, 60, Qt::AlignCenter, tr("bitMap"));painter.setBrush(QColor(0, 0, 0, 100));painter.drawRect(50, 50, 40, 40);painter.end();//繪制PicutureQPicture picture;painter.begin(&picture);painter.setPen(QPen(Qt::green, 3));painter.setBrush(Qt::yellow);painter.drawRect(10, 10, 60, 60);painter.drawText(10, 10, 60, 60, Qt::AlignCenter, tr("QPicture"));painter.setBrush(QColor(0, 0, 0, 100));painter.drawRect(50, 50, 40, 40);painter.end();painter.begin(this);painter.drawImage(50, 20, image);painter.drawPixmap(200, 20, pixMap);painter.drawPixmap(50, 170, bitMap);painter.drawPicture(200, 170, picture);painter.end(); }

運行結(jié)果

07. 附錄

源碼下載:【Qt】2D繪圖之繪制圖像(二).rar

總結(jié)

以上是生活随笔為你收集整理的【Qt】2D绘图之绘制图像(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。