Я делаю простую головоломку.Кусок представляет собой квадрат и содержит соответствующую часть изображения.Что мне нужно сделать, это изменить форму от квадрата до общей формы головоломки.Я сделал шаблон в 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);