QPixmap с прозрачной частью - PullRequest
0 голосов
/ 28 октября 2018

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

1 Ответ

0 голосов
/ 28 октября 2018

Вы должны использовать вместо setAlphaChannel.Маска имеет только значения 0 и 1, в то время как альфа-канал должен допускать 256 вариаций прозрачности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...