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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

QImage QPixmap Mat区别

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。