2015-06-22 343 views
3

我試圖用四個圖像填充圓形。首先,每個相同尺寸的照片刷子,以後按比例縮放最終圖像。但結果不是我想要的。Qt-用圖像填充圓形

目前圈前景和照片的背景,喜歡這裏:
enter image description here
如何填補照片圓形和矩形刪除?

這裏是我的代碼:

QPixmap *CGlobalZone::profPicFromFourPics(QList<QPixmap> pixmapList) 
{ 
     QPixmap *avatar = NULL; 
     QImage roundedImage(CGlobalZone::AVATAR_WIDTH_M*2, CGlobalZone::AVATAR_HEIGHT_M*2, QImage::Format_ARGB32); 
     roundedImage.fill(Qt::transparent); 
     QBrush brush0(pixmapList[0]); 
     QBrush brush1(pixmapList[1]); 
     QBrush brush2(pixmapList[2]); 
     QBrush brush3(pixmapList[3]); 
     QPainter painter(&roundedImage); 
     QPen pen(QColor(176, 216, 242), 1); 
     painter.setRenderHint(QPainter::Antialiasing); 
     painter.setBrush(brush0); 
     painter.drawRect(0 , 0 , CGlobalZone::AVATAR_WIDTH_M , CGlobalZone::AVATAR_HEIGHT_M ); 
     painter.setBrush(brush1); 
     painter.drawRect(CGlobalZone::AVATAR_WIDTH_M , 0 , CGlobalZone::AVATAR_WIDTH_M*2 , CGlobalZone::AVATAR_HEIGHT_M ); 
     painter.setBrush(brush2); 
     painter.drawRect(CGlobalZone::AVATAR_WIDTH_M , CGlobalZone::AVATAR_HEIGHT_M , CGlobalZone::AVATAR_WIDTH_M*2 , CGlobalZone::AVATAR_HEIGHT_M*2 ); 
     painter.setBrush(brush3); 
     painter.drawRect(0 , CGlobalZone::AVATAR_HEIGHT_M , CGlobalZone::AVATAR_WIDTH_M*2 , CGlobalZone::AVATAR_HEIGHT_M*2 ); 
     painter.drawEllipse(0, 0, CGlobalZone::AVATAR_WIDTH_M*2-3 , CGlobalZone::AVATAR_HEIGHT_M*2-3); 
     avatar = new QPixmap(QPixmap::fromImage(roundedImage).scaled(QSize(CGlobalZone::AVATAR_WIDTH_M, CGlobalZone::AVATAR_HEIGHT_M), 
                Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation)); 
     return avatar; 
} 
+2

'的QPixmap :: setMask'? – Amartel

+0

如何在這個問題上使用QPixmap :: setMask? @Amartel – AFN

+0

您需要創建'QBitmap',其中包含'1',您要繪製的位置和'0',其中 - 不是。你可以爲此使用'Qt :: color1'和'Qt :: color0'。由於'QBitmap'繼承了'QPixmap',所以你可以使用'QPainter'在其上畫一個圓。或者你可以從文件中加載它。 – Amartel

回答

2

我將在下面的方式做到這一點(在源代碼註釋詳細信息):

// The avatar image. Should be four, but use one for demonstration. 
QPixmap source("avatar.png"); 

// Initialize the avatar and bring it to a standard size. 
// This step may be skipped if avatars have the same sizes. 
const int width = CGlobalZone::AVATAR_WIDTH_M; 
const int height = CGlobalZone::AVATAR_HEIGHT_M; 
source = source.scaled(width, height); 

// Set up the final image that contains four avatar images. 
QPixmap target(2 * width, 2 * height); 
target.fill(Qt::transparent); 

QPainter painter(&target); 

// Set clipped region (circle) in the center of the target image 
QRegion r(QRect(width/2, height/2, width, height), QRegion::Ellipse); 
painter.setClipRegion(r); 

painter.drawPixmap(0, 0, source);   // First avatar 
painter.drawPixmap(width, 0, source);  // Second avatar 
painter.drawPixmap(0, height, source);  // Third avatar 
painter.drawPixmap(width, height, source); // Fourth avatar 

target.save("test.png"); 
+0

感謝您的回答。 – AFN

0

使用painter paths的任務。而不是drawEllipse你應該做

int dim = CGlobalZone::AVATAR_WIDTH_M*2; 
QPainterPath entirePath; 
QPainterPath ellipsePath; 

entirePath.addRect(0, 0, dim, dim); 
ellipsePath.addEllipse(0, 0, dim-3, dim-3); 
QPainterPath outOfEllipse = entirePath.subtracted(ellipsePath); 
painter.fillPath(outOfEllipse, QBrush(Qt::transparent)); 

編輯:因爲QPainterPath是複雜的情況下,你應該使用QRegion。經過測試,我發現在填充內部和外部相同路徑時可能會出現小像素錯誤(在您的情況下它會很好)。

+0

'QRegion'是一個壞主意,它就像存儲單色蒙版一樣。除了矩形區域以外,它不會看起來很好。 –

+0

'QRegion'確實爲一個簡單的內部圓圈填充渲染效果更好。但是我沒有太多的使用經驗。 – UmNyobe