QPixmap顯示圖片 並 修改圖片


http://hi.baidu.com/eygaqurchnbhsyq/item/2b9624006120f2edff240d42

QPixmap顯示圖片

現在我們來實現在窗口上顯示圖片,並學習怎樣將圖片進行平移,縮放,旋轉和扭曲。這里我們是利用QPixmap類來實現圖片顯示的。

一、利用QPixmap顯示圖片。

1.將以前的工程文件夾進行復制備份,我們這里將工程文件夾改名為painter05。(以前已經說過,經常備份工程目錄,是個很好的習慣)

2.在工程文件夾的debug文件夾中新建文件夾,我這里命名為images,用來存放要用的圖片。我這里放了一張linux.jpg的圖片。如下圖所示。


 

3.在Qt Creator中打開工程。(即打開工程文件夾中的.pro文件),如圖。





4.將dialog.cpp文件中的paintEvent()函數更改如下。

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(“images/linux.jpg”);
    painter.drawPixmap(0,0,100,100,pix);
}

這里新建QPixmap類對象,並為其添加圖片,然后在以(0,0)點開始的寬和高都為100的矩形中顯示該圖片。你可以改變矩形的大小,看一下效果啊。最終程序運行效果如下。



(說明:下面的操作都會和坐標有關,這里請先進行操作,我們在下一節將會講解坐標系統。)

二、利用更改坐標原點實現平移。

Qpainter類中的translate()函數實現坐標原點的改變,改變原點后,此點將會成為新的原點(0,0);

例如:

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(“images/linux.jpg”);
    painter.drawPixmap(0,0,100,100,pix);

    painter.translate(100,100); //將(100,100)設為坐標原點
    painter.drawPixmap(0,0,100,100,pix);
}

這里將(100,100)設置為了新的坐標原點,所以下面在(0,0)點貼圖,就相當於在以前的(100,100)點貼圖。效果如下。

 

三、實現圖片的縮放。

我們可以使用QPixmap類中的scaled()函數來實現圖片的放大和縮小。

例如:

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(“images/linux.jpg”);
    painter.drawPixmap(0,0,100,100,pix);

    qreal width = pix.width(); //獲得以前圖片的寬和高
    qreal height = pix.height();

    pix = pix.scaled(width*2,height*2,Qt::KeepAspectRatio);
    //將圖片的寬和高都擴大兩倍,並且在給定的矩形內保持寬高的比值
    painter.drawPixmap(100,100,pix);
}

其中參數Qt::KeepAspectRatio,是圖片縮放的方式。我們可以查看其幫助。將鼠標指針放到該代碼上,當出現F1提示時,按下F1鍵,這時就可以查看其幫助了。當然我們也可以直接在幫助里查找該代碼。



這是個枚舉變量,這里有三個值,只看其圖片就可大致明白,Qt::IgnoreAspectRatio是不保持圖片的長寬比,Qt::KeepAspectRatio是在給定的矩形中保持長寬比,最后一個也是保持長寬比,但可能超出給定的矩形。這里給定的矩形是由我們顯示圖片時給定的參數決定的,例如painter.drawPixmap(0,0,100,100,pix);就是在以(0,0)點為起始點的寬和高都是100的矩形中。

程序運行效果如下。



四、實現圖片的旋轉。

旋轉使用的是QPainter類的rotate()函數,它默認是以原點為中心進行旋轉的。我們要改變旋轉的中心,可以使用前面講到的translate()函數完成。

例如:

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(“images/linux.jpg”);
    painter.translate(50,50); //讓圖片的中心作為旋轉的中心
    painter.rotate(90); //順時針旋轉90度
    painter.translate(-50,-50); //使原點復原
    painter.drawPixmap(0,0,100,100,pix);
}

這里必須先改變旋轉中心,然后再旋轉,然后再將原點復原,才能達到想要的效果。

運行程序,效果如下。



五、實現圖片的扭曲。

實現圖片的扭曲,是使用的QPainter類的shear(qreal sh,qreal sv)函數完成的。它有兩個參數,前面的參數實現橫行變形,后面的參數實現縱向變形。當它們的值為0時,表示不扭曲。

例如:

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(“images/linux.jpg”);
    painter.drawPixmap(0,0,100,100,pix);
    painter.shear(0.5,0); //橫向扭曲
    painter.drawPixmap(100,0,100,100,pix);
}

效果如下:



其他扭曲效果:

painter.shear(0,0.5); //縱向扭曲                           

painter.shear(0.5,0.5); //橫縱扭曲


             


 圖片形狀的變化,其實就是利用坐標系的變化來實現的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM