Qt中圖片旋轉(zhuǎn)縮放操作的實(shí)現(xiàn)
在我們開發(fā)過程中,難免會遇到加載圖片的問題,在上一個開發(fā)項(xiàng)目里我就遇到了圖片縮放的問題,所以,我決定將這一部分好好研究,記錄下來,希望對大家有幫助喲~
在講解之前,我們先看一看具體的展示效果,有沒有你需要的功能?如果有,那就繼續(xù)跟著我的思路走吧~
功能實(shí)現(xiàn)
具體的功能分成了兩類:旋轉(zhuǎn)、縮放
1:圖片加載
說到了圖片旋轉(zhuǎn),第一個需要講述的功能是:打開文件并加載圖片資源。效果圖右側(cè)是采用QLabel控件進(jìn)行圖片加載。
打開文件并選擇指定圖片路徑這個功能就不用再過多說明了,前兩章節(jié)文章都有進(jìn)行說明,只是采用了QFileDialog::getOpenFileName靜態(tài)函數(shù)。
在圖片加載功能中,唯一需要說明的是QLabel加載圖片資源,代碼如下:
m_qsPicturePath = qsFilePath; QImage img(qsFilePath); ui.labPng->setPixmap(QPixmap::fromImage(img));
代碼說明:
qsFilePath:讀取出來的選擇路徑,并將該字符串賦值給m_qsPicturePath進(jìn)行記錄。
為什么要將該路徑進(jìn)行賦值呢?
對于后續(xù)不同的功能,每改變一次都需要將QImage重新設(shè)置到QLabel控件中,當(dāng)前,也可以采取QImage作為成員變量,這里就隨意了。
接下來就重點(diǎn)講解旋轉(zhuǎn)以及縮放這兩個功能了。在Qt中實(shí)現(xiàn)二維轉(zhuǎn)換功能有兩種方式,分別是:QMatrix、QTransform兩個類。
在書本上介紹的時候一般都是以QMatrix類為主,實(shí)際上該類已經(jīng)過時了,提供它是為了保持舊源代碼的工作,并且強(qiáng)烈建議不要在新代碼中使用它。
This class is obsolete.It is provided to keep old source code working. We strongly advise against using it in new code
在相同實(shí)現(xiàn)功能的方式下,一般會采用QTransform類進(jìn)行實(shí)現(xiàn)的。在Qt中QTransform是推薦的轉(zhuǎn)換類。
QTransform與QMatrix的區(qū)別
它是一個真正的3x3矩陣,允許透視變化。 QTransform的toAffine()方法允許將QTransform轉(zhuǎn)換為QMatrix,如果在矩陣上指定了透視圖轉(zhuǎn)換,那么轉(zhuǎn)換將導(dǎo)致數(shù)據(jù)丟失。
2:旋轉(zhuǎn)
首先我們先講述下旋轉(zhuǎn)功能是如何實(shí)現(xiàn)的。
在這個demo中,分別進(jìn)行了4個角度的旋轉(zhuǎn),0°、90°、180°、270°
無論是哪個角度進(jìn)行轉(zhuǎn)換,都采用QTranform::rotate函數(shù)實(shí)現(xiàn)的。
代碼展示:
QTransform transform; transform.rotate(0); QImage img(m_qsPicturePath); img = img.transformed(transform); ui.labPng->setPixmap(QPixmap::fromImage(img));
代碼解析:
QTransform::rotate()圍繞指定軸逆時針旋轉(zhuǎn)給定角度的坐標(biāo)軸,并返回對矩陣的引用。
當(dāng)前的旋轉(zhuǎn)角度是°,大家在使用的時候可以根據(jù)自己的角度自行設(shè)置,只需要修改rotate的參數(shù)就可以了,參數(shù)角度是用度數(shù)表示的。
有一點(diǎn)需要注意的是:如果將QTransform用于小部件坐標(biāo)中定義的點(diǎn),旋轉(zhuǎn)方向?qū)⑹琼槙r針的,因?yàn)閅軸指向下方。
既然提到了QMatrix類,那么使用該類是如何實(shí)現(xiàn)的呢?
QMatrix matrix; matrix.rotate(90); QImage img(m_qsPicturePath); img = img.transformed(matrix); ui.labPng->setPixmap(QPixmap::fromImage(img));
3:縮放
代碼展示:
QTransform transform; transform.scale(2, 2); QImage img(m_qsPicturePath); img = img.transformed(transform); ui.labPng->setPixmap(QPixmap::fromImage(img));
代碼解析:
QTransform::scale()水平方向按sx和垂直方向按sy縮放坐標(biāo)系統(tǒng),并返回對矩陣的引用。
對于scale的參數(shù),可以簡單的理解:想要實(shí)現(xiàn)放大功能,參數(shù)大于1,想要實(shí)現(xiàn)縮放功能,參數(shù)小于1
當(dāng)前例子代碼對圖片進(jìn)行了兩倍放大,假設(shè)要是縮放,只需要設(shè)置成:transform.scale(0.5, 0.5);
注意:當(dāng)參數(shù)是(1,1)時,說明圖片既沒有放大也沒有縮小。
QMatrix的調(diào)用方式一致,只是類名換了,調(diào)用的參數(shù)名都是一致的,轉(zhuǎn)換角度那里已經(jīng)寫明了使用方式,這里就不再過多說明了。因?yàn)镼Matrix是Qt中遺棄掉的功能,以后大家都使用QTransform類就可以了。
總結(jié)
到這里,旋轉(zhuǎn)縮放的功能就已經(jīng)實(shí)現(xiàn)了。
在這個小demo中,難度不大,最值得記錄的是使用哪個類進(jìn)行操作,在Qt中QTranform的是被推薦的,只要好好讀懂類參數(shù),就能實(shí)現(xiàn)簡單的圖形轉(zhuǎn)換操作,如果有想要了解這兩個類的詳細(xì)說明的,下面我會把鏈接貼出來,具體的函數(shù)操作大家可以自行學(xué)些
到此這篇關(guān)于Qt中圖片旋轉(zhuǎn)縮放操作的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt 圖片旋轉(zhuǎn)縮放內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中指針 int *p=0;和int *p;*p=0;和”&“的關(guān)系和區(qū)別詳解
這篇文章主要介紹了C語言中指針 int *p=0;和int *p;*p=0;和”&“有什么關(guān)系和區(qū)別,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02- 形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都可以使用, 離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用,形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時, 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送2021-11-11