Название: Сложить два QPixmap Отправлено: Ginger_Ministrel от Август 11, 2015, 07:05 Задача: есть несколько QPixmap одинакового размера с кусочками картинки на полностью прозрачном фоне. Нужно получить из них один суммарный. Есть ли какие-то стандартные функции, или нужно поточечно их совмещать, переведя в QImage?
И дополнительный вопрос: стоит ли это затрат в случае, если нужно получить QGraphicsPixmapItem в итоге, или дешевле и проще создать несколько айтемов и просто поставить один над другим на сцене? Название: Re: Сложить два QPixmap Отправлено: gil9red от Август 11, 2015, 07:24 Рисуете QPainter (http://doc.qt.io/qt-4.8/qpainter.html)'ом их друг на друге
Название: Re: Сложить два QPixmap Отправлено: deMax от Ноябрь 22, 2015, 00:57 А если нужно нарисовать значок произвольного цвета обведенный черной рамкой
Код: pix = QPixmap(QImageReader(":/mask.png").size()); Можно ли закрасить картинку одним цветом не трогая альфа канал? Название: Re: Сложить два QPixmap Отправлено: Igors от Ноябрь 22, 2015, 12:12 Так нормально или можно сделать более быстрый и правильный код? Конечно можно. Напр здесь был бы очень к месту класс который проходится по всем пикселям и применяет к каждому заданный юзером функтор/лямбду. Но если это 1-2 операции для картинки 100x100 и меньше - следует стремиться к минимуму написанных строк, как у ВасНазвание: Re: Сложить два QPixmap Отправлено: deMax от Ноябрь 24, 2015, 08:28 Но если это 1-2 операции для картинки 100x100 и меньше - следует стремиться к минимуму написанных строк, как у Вас Иконки в среднем 16х16, под сотню. Сделал в цикле, т.к. битовая маска(когда от альфа канала остается 2 значения) мне совсем не подходит.Код: inline QRgb mix(const QRgb &c1,const QRgb &c2) { // на первый цвет накладывает второй цвет (оба цвета с произвольной прозрачностью) Название: Re: Сложить два QPixmap Отправлено: Igors от Ноябрь 24, 2015, 11:45 Код: inline QRgb mix(const QRgb &c1,const QRgb &c2) { // на первый цвет накладывает второй цвет (оба цвета с произвольной прозрачностью) Название: Re: Сложить два QPixmap Отправлено: deMax от Ноябрь 26, 2015, 11:38 Все верно, только mix - не очень удачное название, это вычитающая (subtractive) модель. с2 - front, c1 - back так вычитающая модель это например CMYK для печати или рисование на бумаге.У меня алгоритм реализует Normal (Нормальный) режим наложения или смешивания слоев (blending modes). (Языком фотошопа, по умолчанию который) вы правы написал в спешке дурацкое название и аргументы и забыл исправить, после проверки. inline QRgb normalBlend(const QRgb &back,const QRgb &front) - наверно так правильнее, правда в терминологии фотошопа. Название: Re: Сложить два QPixmap Отправлено: Igors от Ноябрь 26, 2015, 11:55 так вычитающая модель это например CMYK для печати или рисование на бумаге. Это модель прозрачности (а не цвета). Есть еще additive, ну и просто смешивание (цвета равноправны). И не фотошоп это придумал :)Название: Re: Сложить два QPixmap Отправлено: deMax от Ноябрь 27, 2015, 12:29 Это модель прозрачности (а не цвета). Есть еще additive, ну и просто смешивание (цвета равноправны). И не фотошоп это придумал :) Ну придумано это было еще когда на прозрачной кальке рисовали и накладывали друг на друга.Что значит вычитание, где почитать? У нас 2 цвета формата(RGB+A), алгоритм загоняет в прозрачность верхнего цвета нижний цвет - аналог кальки(полупрозрачность для краев). p.s. добавил пару строк чтобы быстрее работало(как правило полупрозрачных символов мало) Код: int aBack(qAlpha(back)); Название: Re: Сложить два QPixmap Отправлено: Igors от Ноябрь 27, 2015, 14:12 Что значит вычитание, где почитать? Не помню, так всю жизнь было :) Ну придумано это было еще когда на прозрачной кальке рисовали и накладывали друг на друга. Другая модель (обычно называется "фильтр"): смотрим через зеленое (бутылочное) стекло. Зеленые лучи пропускает, остальные (частично) поглощает Название: Re: Сложить два QPixmap Отправлено: deMax от Ноябрь 30, 2015, 11:39 Не помню, так всю жизнь было :) Я понял о чем вы говорите. У вас источник света за калькой(светящийся стол в темноте) и нарисованное на кальке поглощает свет. У меня ситуация другая - у меня источник света над калькой, непрозрачные пиксели видны сразу, а прозрачные и полупрозрачные отдаются следующему слою.В кино так делали, нарисуют задний фон, а потом нарисуют микимауса на прозрачной бумаге(кальке) и накладывают сверху. p.s. у меня значки с обводкой и бликами, сначала раскрашиваю в выбранный цвет маску, потом накладываю обводку и блики. Генерировать из векторных не стал, т.к. значки маленькие и получиться не очень красиво. |