2012-10-10 110 views
2

我在Qt中旋轉圖像時遇到了一些問題。每次我用QPainter旋轉圖像時,它變得越來越扭曲。這是最初的圖像:旋轉圖像導致Qt失真

http://imageshack.us/photo/my-images/838/ship1.png/

一些迭代它成爲後:

http://imageshack.us/photo/my-images/11/ship2e.png/

這是我的代碼:

void Ship::Move(int x, int y) 
{ 
    QPixmap rotatePixmap(shipPixels.size()); 
    rotatePixmap.fill(Qt::transparent); 

    QTransform transform; 
    transform.translate(
      rotatePixmap.size().width()/2, 
      rotatePixmap.size().height()/2 
    ); 

    transform.rotate(degree); 
    transform.translate(
      - rotatePixmap.size().width()/2, 
      - rotatePixmap.size().height()/2 
    ); 

    QPainter p(&rotatePixmap); 
    p.setRenderHints(
      QPainter::Antialiasing | QPainter::SmoothPixmapTransform, 
      true 
    ); 

    p.setTransform(transform); 
    p.drawPixmap(0, 0, shipPixels); 
    p.end(); 

    shipPixels = rotatePixmap; 
    this->setPixmap(shipPixels); 
    this->move(QPoint(x, y)); 
    degree = 0; 
} 

對我來說,Qt的保持圖像質量。行爲是完全陌生的。有理由嗎?

+11

您需要每次計算新的新的旋轉位圖。你正在積累四捨五入的錯誤。 – asawyer

+1

是的,如果你離開船舶像素之間沒有觸摸幀,而是使用它作爲你的錨點,你應該很好去。 – Thadeux

+2

你看到的效果是不可避免的,因爲旋轉90度以外的任何量都是有損操作。損失加起來。它與Qt無關。 –

回答

1

根據解答新代碼是這樣的。與同樣的問題,發現自己的其他用戶就可以得到這個代碼:

void Ship::Move(int x, int y) 
{ 
    QPixmap sourceImage(shipPixels); 

    QPixmap rotatePixmap(sourceImage.size()); 
    rotatePixmap.fill(Qt::transparent); 

    QTransform transform; 
    transform.translate(sourceImage.size().width()/2, sourceImage.size().height()/2); 
    transform.rotate(degree); 
    transform.translate(-sourceImage.size().width()/2, -sourceImage.size().height()/2); 

    QPainter p; 
    p.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform, true); 
    p.begin(&rotatePixmap); 
    p.setTransform(transform); 
    p.drawPixmap(0, 0, sourceImage); 
    p.end(); 

    rotatePixmap.save("temp.png"); 

    this->setPixmap(rotatePixmap); 
    this->move(QPoint(x, y)); 
} 
-3
QPainter pixmap; 
pixmap.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform,true); 

這就是你在找什麼。