QPixmap類用于繪圖裝置的圖像顯示,它即可以作為一個繪圖對象,也可以加載到一個控件中,通常是标簽或按鈕,用于在标簽或按鈕上顯示圖像。
QPixmap可以讀取的圖像檔案類型有BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM等
QPixmap與QImage的差別:
QPixmap依賴于硬體,QImage不依賴于硬體
QPixmap主要是用于繪圖,針對螢幕顯示而最佳化設計,QImage主要是為圖像I/O、圖檔通路和像素修改而設計的
當圖檔小的情況下,直接用QPixmap進行加載,畫圖時無所謂,當圖檔大的時候如果直接用QPixmap進行加載,會占很大的記憶體,一般一張幾十K的圖檔,用QPixmap加載進來會放大很多倍,是以一般圖檔大的情況下,用QImage進行加載,然後轉乘QPixmap使用者繪制。QPixmap繪制效果是最好的
#include <QPixmap>
載入圖像和顯示
QLabel* label=new QLabel(this);
label->move(10,10);
label->resize(500,500);
QPixmap pm("./ma.jpg"); //建立QPixmap對象并讀取圖像
QPixmap p; //建立QPixmap對象
p.load("./laohu.jpg"); //載入圖像
//重複load同一圖像時,容易出錯,解決辦法看:https://blog.csdn.net/doupi2008/article/details/44960003/
label->setPixmap(p); //在label标簽中顯示圖像
label->adjustSize();
QPixmap(const QString &fileName, const char *format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor);//從指定的檔案中加載圖像并生成QPixmap對象
參數2:format:字元串,表示圖像檔案的格式,如果為0,将進行自動識别
參數3:flags:表示顔色的轉換模式
1) Qt::AutoColor:由系統自動決定。
2) Qt::ColorOnly:彩色模式。
3) Qt::MonoOnly:單色模式
常用操作
QLabel* label=new QLabel(this);
label->move(10,10);
label->resize(400,400);
QLabel* label1=new QLabel(this);
label1->move(450,10);
label1->resize(400,400);
QPixmap p("./ma.jpg");
QRect r=QRect(150,150,300,300);
QPixmap p1=p.copy(r); //傳回指定區域的圖像
QPixmap p2=p.copy(150,150,300,200); //傳回指定區域的圖像
p1.save("./ss.jpg"); //儲存圖像
//p2.fill(QColor(0,0,255)); //用給定的顔色填充pixmap
//預設:Qt::white
bool b=p2.hasAlpha(); //如果此pixmap有alpha通道或有掩碼,則傳回true,否則傳回false
int n=p2.height(); //傳回圖像的高
n=p2.width(); //傳回圖像的寬
QSize s1=p2.size();//傳回圖像的寬高
b=p2.isNull(); //如果這是空的pixmap,則傳回true;否則傳回false
//空pixmap具有零寬度、零高度和無内容。不能在空pixmap中繪制
QSize s(200,100);
QPixmap p3=p2.scaled(s);//将p2縮放成指定大小,然後傳回新圖像
QPixmap p4=p1.scaled(s,Qt::KeepAspectRatio); //縮放圖像
/*
參數2:可選
IgnoreAspectRatio 預設 矩形框有多大,圖檔就縮放成多大,不限制原圖檔的長寬比
KeepAspectRatio 保持原圖檔的長寬比,且不超過矩形框的大小
KeepAspectRatioByExpanding 根據矩形框的大小最大縮放圖檔
參數3:可選
Qt::FastTransformation 預設 轉換快速執行,沒有任何平滑處理
Qt::SmoothTransformation 使用雙線性濾波對生成的圖像進行轉換
*/
p4=p1.scaledToHeight(200); //按照高度縮放
/*
參數2:可選
Qt::FastTransformation 預設 轉換快速執行,沒有任何平滑處理
Qt::SmoothTransformation 使用雙線性濾波對生成的圖像進行轉換
*/
p4=p1.scaledToWidth(200); //按照寬度縮放
/*
參數2:可選
Qt::FastTransformation 預設 轉換快速執行,沒有任何平滑處理
Qt::SmoothTransformation 使用雙線性濾波對生成的圖像進行轉換
*/
QImage im=p1.toImage(); //将QPixmap對象轉換為QImage對象
//fromImage() 将QImage對象轉換為QPixmap對象
QTransform tf; //坐标變換
tf.rotate(30.5,Qt::YAxis);
//參數1:旋轉角度
//參數2:旋轉軸 Qt::XAxis Qt::YAxis Qt::ZAxis預設
QPixmap p5=p4.transformed(tf,Qt::FastTransformation); //傳回旋轉後的圖像
/*
參數1:旋轉角度 正數:順時針 負數:逆時針
參數2:Qt::FastTransformation 預設 變換執行迅速,無需平滑
Qt::SmoothTransfor 利用雙線性濾波對得到的圖像進行變換
*/
qDebug()<<s1;
label->setPixmap(p1); //在label标簽中顯示圖像
label->adjustSize();
label1->setPixmap(p5);
label1->adjustSize();
作為繪圖裝置
QLabel* label=new QLabel(this);
label->move(10,10);
label->resize(400,400);
QPixmap p(300,300); //建立QPixmap空白圖像對象
//參數:圖像大小
QPainter painter(&p); //建立畫家
//參數:繪圖裝置
painter.fillRect(100,100,100,50,Qt::blue);//在pix上繪制正方形
label->setPixmap(p); //在label标簽中顯示圖像
label->adjustSize();