带有透明部分的QPixmap

问题描述 投票:0回答:1

我正在制作一个简单的益智游戏。该块是一个正方形,它包含图像的相应部分。

我需要做的是将形状从正方形更改为常见的拼图形状。我在 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);
c++ qt qpixmap
1个回答
0
投票

您应该使用

setAlphaChannel
来代替。蒙版仅具有 0 和 1 值,而 Alpha 通道应允许 256 种透明度变化。

© www.soinside.com 2019 - 2024. All rights reserved.