QImage QPixmap Mat区别
cvMat可以通過自定義函數轉換為QImage
Qimage通過fromImage函數 可以轉換為QPixmap
繪圖設備是指繼承QPainterDevice的子類。Qt一共提供了四個這樣的類,分別是QPixmap、QBitmap、QImage和 QPicture。其中,QPixmap專門為圖像在屏幕上的顯示做了優化,而QBitmap是QPixmap的一個子類,它的色深限定為1,你可以使用 QPixmap的isQBitmap()函數來確定這個QPixmap是不是一個QBitmap。QImage專門為圖像的像素級訪問做了優化。 QPicture則可以記錄和重現QPainter的各條命令。下面我們將分兩部分介紹這四種繪圖設備。
QPixmap繼承了QPaintDevice,因此,你可以使用QPainter直接在上面繪制圖形。QPixmap也可以接受一個字符串作為一個文件的路徑來顯示這個文件,比如你想在程序之中打開png、jpeg之類的文件,就可以使用 QPixmap。使用QPainter的drawPixmap()函數可以把這個文件繪制到一個QLabel、QPushButton或者其他的設備上面。QPixmap是針對屏幕進行特殊優化的,因此,它與實際的底層顯示設備息息相關。注意,這里說的顯示設備并不是硬件,而是操作系統提供的原生的繪圖引擎。所以,在不同的操作系統平臺下,QPixmap的顯示可能會有所差別。
QPixmap提供了靜態的grabWidget()和grabWindow()函數,用于將自身圖像繪制到目標上。同時,在使用QPixmap時,你可以直接使用傳值也不需要傳指針,因為QPixmap提供了“隱式數據共享”。關于這一點,我們會在以后的章節中詳細描述,這里只要知道傳遞QPixmap不必須使用指針就好了。
QBitmap繼承自QPixmap,因此具有QPixmap的所有特性。QBitmap的色深始終為1. 色深這個概念來自計算機圖形學,是指用于表現顏色的二進制的位數。我們知道,計算機里面的數據都是使用二進制表示的。為了表示一種顏色,我們也會使用二進制。比如我們要表示8種顏色,需要用3個二進制位,這時我們就說色深是3. 因此,所謂色深為1,也就是使用1個二進制位表示顏色。1個位只有兩種狀態:0和1,因此它所表示的顏色就有兩種,黑和白。所以說,QBitmap實際上是只有黑白兩色的圖像數據。
由于QBitmap色深小,因此只占用很少的存儲空間,所以適合做光標文件和筆刷。
下面我們來看同一個圖像文件在QPixmap和QBitmap下的不同表現:
void PaintedWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPixmap pixmap("Cat.png");
QBitmap bitmap("Cat.png");
painter.drawPixmap(10, 10, 128, 128, pixmap);
painter.drawPixmap(140, 10, 128, 128, bitmap);
QPixmap pixmap2("Cat2.png");
QBitmap bitmap2("Cat2.png");
painter.drawPixmap(10, 140, 128, 128, pixmap2);
painter.drawPixmap(140, 140, 128, 128, bitmap2);
}
先來看一下運行結果:
?
這里我們給出了兩張png圖片。Cat.png是沒有透明色的純白背景,而Cat2.png是具有透明色的背景。我們分別使用QPixmap和QBitmap來加載它們。注意看它們的區別:白色的背景在Qbitmap中消失了,而透明色在QBitmap中轉換成了黑色;其他顏色則是使用點的疏密程度來體現的。
QPixmap使用底層平臺的繪制系統進行繪制,無法提供像素級別的操作,而QImage則是使用獨立于硬件的繪制系統,實際上是自己繪制自己,因此提供了像素級別的操作,并且能夠在不同系統之上提供一個一致的顯示形式。
?
如上圖所示(出自Qt API文檔),我們聲明了一個QImage對象,大小是3 x 3,顏色模式是RGB32,即使用32位數值表示一個顏色的RGB值,也就是說每種顏色使用8位。然后我們對每個像素進行顏色賦值,從而構成了這個圖像。你可以把QImage想象成一個RGB顏色的二維數組,記錄了每一像素的顏色。
最后一個需要說明的是QPicture。這是一個可以記錄和重現QPainter命令的繪圖設備。 QPicture將QPainter的命令序列化到一個IO設備,保存為一個平臺獨立的文件格式。這種格式有時候會是“元文件(meta- files)”。Qt的這種格式是二進制的,不同于某些本地的元文件,Qt的pictures文件沒有內容上的限制,只要是能夠被QPainter繪制的元素,不論是字體還是pixmap,或者是變換,都可以保存進一個picture中。
QPicture是平臺無關的,因此它可以使用在多種設備之上,比如svg、pdf、ps、打印機或者屏幕。回憶下我們這里所說的QPaintDevice,實際上是說可以有QPainter繪制的對象。QPicture使用系統的分辨率,并且可以調整 QPainter來消除不同設備之間的顯示差異。
如果我們要記錄下QPainter的命令,首先要使用QPainter::begin()函數,將QPicture實例作為參數傳遞進去,以便告訴系統開始記錄,記錄完畢后使用QPainter::end()命令終止。代碼示例如下:
QPicture picture;
QPainter painter;
painter.begin(&picture); // paint in picture
painter.drawEllipse(10,20, 80,70); // draw an ellipse
painter.end(); // painting done
picture.save("drawing.pic"); // save picture
如果我們要重現命令,首先要使用QPicture::load()函數進行裝載:
QPicture picture;
picture.load("drawing.pic"); // load picture
QPainter painter;
painter.begin(&myImage); // paint in myImage
painter.drawPicture(0, 0, picture); // draw the picture at (0,0)
painter.end();
上文出處:http://devbean.blog.51cto.com/448512/239845
?
另附網文一篇:
QPixmap/QImage/QPicture
?
?
? ? ? ?QImage與Qpixmap的區別
?
1、QPixmap主要是用于繪圖,針對屏幕顯示而最佳化設計,QImage主要是為圖像I/O、圖片訪問和像素修改而設計的
?
2、QPixmap依賴于所在的平臺的繪圖引擎,故例如反鋸齒等一些效果在不同的平臺上可能會有不同的顯示效果,QImage使用Qt自身的繪圖引擎,可在不同平臺上具有相同的顯示效果
?
3、目前的Qt會把QPixmap都存儲在graphics memory中,QImage是存儲在客戶端的,是獨立于硬件的。在 X11, Mac 以及 Symbian平臺上,QPixmap 是存儲在服務器端,而QImage則是存儲在客戶端,在Windows平臺上,QPixmap和QImage都是存儲在客戶端,并不使用任何的GDI資源。
?
4、由于QImage是獨立于硬件的,也是一種QPaintDevice,因此我們可以在另一個線程中對其進行繪制,而不需要在GUI線程中處理,使用這一方式可以很大幅度提高UI響應速度。
?
5、QImage可通過setPixpel()和pixel()等方法直接存取指定的像素,Qt的文檔中有如下例程:
?
?
| QImage image(3, 3, QImage::Format_RGB32); QRgb value; value = qRgb(189, 149, 39); image.setPixel(1, 1, value); value = qRgb(122, 163, 39); image.setPixel(0, 1, value); image.setPixel(1, 0, value); value = qRgb(237, 187, 51); image.setPixel(2, 1, value); | ? |
?
?
·QImage的顯示
?
·QPainter中繪制QImage的接口原型:
?
void QPainter::drawImage ( int x, int y,
const QImage & image,
int sx = 0, int sy = 0,
int sw = -1, int sh = -1,
Qt::ImageConversionFlags flags = Qt::AutoColor )
?
其中x和y為繪制位置,sx和sy是指圖像左上角的坐標,sw和sh是指定了圖像的大小,如果都為0或負數,就顯示完整個圖像。
?
QImage image;
image.load( ":/pics/earth.png" );
?
QPainter painter(this);
painter.drawImage(0,0, image);
?
·當圖片較大時,我們可以先通過QImage將圖片加載進來,然后把圖片縮放成需要的尺寸,最后轉換成QPixmap 進行顯示。
?
QImage image;
image.load( ":/pics/earth.png" );
?
QPainter painter(this);
QPixmap pixmapToShow = QPixmap::fromImage( image.scaled(size(), Qt::KeepAspectRatio) );
painter.drawPixmap(0,0, pixmapToShow);
?
?
?
·QBitmap與QPixmap
?
·QBitmap是QPixmap的一個子類,主要用于顯示單色位圖。用于制作游標QCursor或筆刷QBrush等,圖像顯示對比如下
?
QPixmap pixImg("caterpillar.jpg");
QBitmap bitImg("caterpillar.jpg");
QPainter painter(this);
painter.drawPixmap(0, 0, pixImg);
painter.drawPixmap(200, 0, bitImg);
?
?
?
·QPicture
?
·QPicture則是一個繪圖裝置,用于記錄和重播Qpainter的繪圖指令。
·使用begin()方法在QPicture上進行繪圖,使用end()結束繪圖,使用save()保存至檔案
?
QPicture picture;
QPainter painter;
painter.begin(&picture);
painter.drawRect(10, 20, 100, 50);
painter.end();
picture.save("draw_record.pic");
?
需重播繪圖指令的話,新建一個QPicture對象,使用load()重新載入保存的檔案,然后再在指定的繪圖設備QDevice上繪制QPicture:
?
QPicture picture;
picture.load("draw_record.pic");
QPainter painter;
painter.begin(this);
painter.drawPicture(0, 0, picture);
painter.end();
轉自:http://blog.csdn.net/cc96610536/article/details/8803265
https://blog.csdn.net/zzwdkxx/article/details/39480559
其他參考博文:
http://blog.csdn.net/addfourliu/article/details/6880505
http://blog.csdn.net/woay2008/article/details/9570519
?
總結
以上是生活随笔為你收集整理的QImage QPixmap Mat区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js设置了location.href不跳
- 下一篇: C++基础12-类和对象之操作符重载-s