QT - 圖像處理 ( 3 ) - QTransform 概述

QTransform類

QTransform類用於控制二維座標系之間的轉換

包含:位移、縮放、扭曲、旋轉還有映射

首先看它的核心內容:

在這裏插入圖片描述

這是一個仿射變換矩陣(affine transformation),它包含了座標系轉換所需要的所有信息

element description
m11 水平縮放
m22 垂直縮放
m21 水平扭曲
m12 垂直扭曲
m31(dx) 水平位移
m32(dy) 垂直位移
m13 水平映射
m23 垂直映射
m33 額外的映射因子

他們具體的功能可以看下圖:

在這裏插入圖片描述

 你可以直接使用

void setMatrix(qreal m11, qreal m12, qreal m13, 
                qreal m21, qreal m22, qreal m23, 
                qreal m31, qreal m32, qreal m33)

來設置這些元素

當然,QTransform也提供了很多方法來方便你使用

method  descripiton
QTransform.translate(qreal dx, qreal dy) dx,dy爲任意大小的實數,保存到m31(dx)和m32(dy)中
QTransform.scale(qreal sx, qreal sy) sx,sy爲任意大小的實數,保存到m11和m22中
QTransform.rotate(qreal angle) angle爲任意大小的實數,不過爲了便於閱讀,最好是0到360之間
QTransform.shear(qreal sh, qreal sv) sh,sv爲任意大小的實數,保存到m12和m21中

基礎操作

平移

translate() 可將座標原點變更爲指定的座標點 (x, y)。

這裏,將座標原點由 (0, 0) 變爲 (120, 20)。

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);

    QTransform transform;
    // 平移
    transform.translate(120, 20);

    painter.setTransform(transform);
    painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}

旋轉

rotate() 使用角度技巧表示遠近。設置第二個參數爲角度的常量值後,可以使用 X 軸、Y 軸、Z 軸技巧。它默認是以原點爲中心進行旋轉的,如果要改變旋轉的中心,可以使用 translate() 函數完成。

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);

    QTransform transform;
    // 平移
    transform.translate(120, 20);
    // 旋轉
    transform.rotate(45, Qt::XAxis);

    painter.setTransform(transform);
    painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}

縮放

scale() 可以進行縮放。

這裏,使繪製的圖像縮小到原來的一半。

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);

    QTransform transform;
    // 平移
    transform.translate(120, 20);
    // 旋轉
    transform.rotate(45);
    // 縮放
    transform.scale(0.5, 0.5);

    painter.setTransform(transform);
    painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}

扭曲(錯切變換)

shear() 可以實現圖片的扭曲。它有兩個參數,前面的參數實現橫向變形,後面的參數實現縱向變形。當它們的值爲 0 時,表示不扭曲。

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);

    QTransform transform;
    // 橫向扭曲
    transform.shear(0.5, 0);

    painter.setTransform(transform);
    painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}

假設(w, z)爲原始輸入空間,(x, y)爲變換後的座標空間。
這裏寫圖片描述

水平方向

  • 仿射矩陣爲

                           \left[\begin{matrix}1 & tan\beta & 0 \\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]

  • 座標變換等式爲

                          \begin{matrix} x& = & w \\ y& = & w tan\beta & + z \end{matrix}



  •  

這裏寫圖片描述

反方向類似。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章