Рисунок wxWidgets с многослойной прозрачностью

Я использую wxWidgets для разработки графического интерфейса, который рисует несколько слоев с прозрачностью друг над другом. Поэтому у меня есть один метод для каждого слоя, который рисует wxGraphicsContext на «общий» wxImage, который затем наносится на wxWindow в методе paintEvent.

У меня есть данные слоя в массивах точно такого же размера, что и мой wxImage, и поэтому мне, конечно, нужно рисовать / манипулировать пикселями. В настоящее время я делаю это с помощью drawRectangle-подпрограммы. Я предполагаю, что это довольно неэффективно.

Есть ли умный способ напрямую управлять пиксельными данными wxImage, позволяющий мне по-прежнему использовать прозрачность каждого отдельного слоя в итоговом изображении? Или достаточно ли рисунка 1x1 пиксель с drawRectangle?

Спасибо за любые мысли по этому поводу!


person mad    schedule 12.11.2014    source источник
comment
Не совсем понятно, что такое drawRectangle(). Кроме того, вы используете wxGraphicsContext::Create(wxImage&) или как вы рисуете на своем изображении?   -  person VZ.    schedule 12.11.2014
comment
да, правильно, я использую именно эту функцию wxGraphicsContext::Create(wxImage&)   -  person mad    schedule 12.11.2014


Ответы (1)


Вы можете эффективно управлять wxImage пикселями, просто обращаясь к ним напрямую, они хранятся в двух смежных массивах RGB и альфа, с которыми вы можете работать напрямую.

Обычно проблема заключается в преобразовании этого wxImage в wxBitmap, который может отображаться - это дорогостоящая операция, и, чтобы избежать ее, можно использовать доступ к необработанному растровому изображению для непосредственного управления wxBitmap.

person VZ.    schedule 12.11.2014
comment
спасибо за Ваш ответ. Я точно думал о доступе к этим пиксельным данным, но не знаю, как вычислить rgb и альфа вручную для пикселя, на котором я рисую несколько слоев. Это легко понять? - person mad; 12.11.2014
comment
В целом, конечно, не все так просто, но некоторые операции можно легко определить на отдельных пикселях. Я действительно не понимаю, что вы делаете, чтобы сказать больше, извините. Дело в том, что вы либо работаете с пикселями напрямую, используя wxImage::GetData(), либо рисуете на нем, используя wxGraphicsContext, в зависимости от того, что вам больше подходит. - person VZ.; 12.11.2014