【问题标题】:QPixmap with a transparent part具有透明部分的 QPixmap
【发布时间】:2019-04-01 07:29:56
【问题描述】:

我正在制作一个简单的益智游戏。这块是一个正方形,它包含图像的相应部分。我需要做的是将形状从正方形更改为常见的拼图形状。我在 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);
}

它在Image Composition example 中的工作方式类似,但在我的项目中我得到黑色像素而不是透明像素:Output。想不通,怎么回事。 mask初始化:

mask.load("://Templates/c1.png");
mask = mask.scaled(90, 90, Qt::KeepAspectRatio, Qt::SmoothTransformation);
mask = mask.convertToFormat(QImage::Format_ARGB32_Premultiplied);

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    您应该改用setAlphaChannel。蒙版只有 0 和 1 值,而 Alpha 通道应允许 256 种透明度变化。

    【讨论】:

    • 感谢您的回答。文档不建议使用setAlphaChannel。我尝试了另一种方法,但仍然存在一些问题(请参阅更新:部分)。
    • 你试过这个 - stackoverflow.com/questions/7594066/… 吗?
    • 这与我尝试过的类似。如果我在void puzzle::paint 的末尾添加painter.fillRect(resultImage.rect(), Qt::white);(或任何其他颜色)和QPainter::CompositionMode_DestinationOver,它工作正常 - 我看到我的作品具有我的模板形状,其余部分填充了选定的颜色。但是,如果我使用Qt::transparent,它会显示为黑色。
    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多