我正在制作一个简单的益智游戏。该块是一个正方形,它包含图像的相应部分。
我需要做的是将形状从正方形更改为常见的拼图形状。我在 Photoshop 中制作了一个模板:
现在,我需要以某种方式使用它作为遮罩来改变我的方形块的形状。我尝试了以下方法:
QImage temp;
temp.load("://Templates/c1.png");
temp = temp.convertToFormat(QImage::Format_Mono);
QBitmap bit;
bit = QBitmap::fromImage(temp);
puz->img.setMask(bit);
哪里
puzzle->img
是我的方块。
它可以工作,但我在连接器中遇到“粗糙的角落”。我想所有半透明像素都会完全填充颜色(或完全透明?),所以这就是为什么它看起来不平滑。
如何让它更顺畅?
我尝试了一种不同的方法:由于
setAlphaChannel()
是一个过时的函数,文档说我需要使用 QPainter::CompositionMode
。我尝试了以下
void puzzle::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget )
{
painter->setCompositionMode(QPainter::CompositionMode_Source);
painter->fillRect(x, y, 90, 90, Qt::transparent);
painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
painter->drawPixmap(x, y, 90, 90, img);
painter->setCompositionMode(QPainter::CompositionMode_DestinationIn);
painter->drawImage(x,y, mask);
}
它的工作原理类似于图像合成示例,但我在项目中得到黑色像素而不是透明像素:
mask
初始化:
mask.load("://Templates/c1.png");
mask = mask.scaled(90, 90, Qt::KeepAspectRatio, Qt::SmoothTransformation);
mask = mask.convertToFormat(QImage::Format_ARGB32_Premultiplied);
您应该使用
setAlphaChannel
来代替。蒙版仅具有 0 和 1 值,而 Alpha 通道应允许 256 种透明度变化。