wxWidgets - Альфа-смешивание

Есть ли способ в wxWidget выполнять операции альфа-смешивания, такие как умножение альфа-канала растрового изображения на RGB другого растрового изображения для создания новых изображений (например, рендеринг фотографии в виде сглаженной круглой формы).


person rui    schedule 16.08.2009    source источник
comment
Я хотел бы знать, как это сделать, а также. Atm я использую регион, чтобы получить твердую альфа-работу.   -  person Lodle    schedule 16.08.2009


Ответы (1)


Хотя я сам не занимался альфа-смешиванием, я считаю, что wxGraphicContext — это то, что вам нужно.

http://docs.wxwidgets.org/stable/wx_wxgraphicscontext.html

У меня есть рисование без мерцания в графическом контексте (на Win32) с помощью следующее в моем обработчике событий рисования:

void OnPaint( wxPaintEvent& e )
{
    wxBufferedPaintDC dc( this );        
    wxGraphicsContext* gdc = wxGraphicsContext::Create( dc );
    // you drawing code here
}

РЕДАКТИРОВАТЬ: эта электронная почта может дать дополнительную информацию:

http://www.nabble.com/Is-alpha-blending-implemented-when-using-DC%27s--td17183159.html

person Daniel Paull    schedule 16.08.2009
comment
Хм, это не совсем так. Допустим, у меня есть квадратное изображение. Метод blit в DC или аналогичный в wxGraphicsContext позволяет отображать только все растровое изображение или его прямоугольные части. Как бы я мог отобразить только круглую область моего исходного изображения. Обычно я визуализировал круг в целевой буфер, предварительно очистив его до 255 альфа. Затем я бы просто смешал изображение в альфа-канале с буфером, умножая альфа-значения на отдельные компоненты RGB. Думаю, я сделаю это вручную... Выложу реализацию. - person rui; 17.08.2009
comment
Вы подтвердили, что метод DrawBitmap объекта wxGraphicsContext не обращает внимания на альфа-канал при рисовании? Кроме того, вы также можете использовать OpenGL для рисования изображений, поскольку wxWidgets имеет холст OpenGL. - person Daniel Paull; 17.08.2009
comment
Вот код, который я хотел бы использовать: wxBitmap my_image = LoadSomePngWithNoAlpha(); буфер wxBitmap; wxMemoryDc dc = новый wxMemoryDc (буфер); dc.SetBrush(wxCoulor(0, 0, 0, 0)); DC.Очистить(); dc.BlitBitmapAsCircle (растровое изображение, wxPoint (5,5), 42,0); Чтобы сделать этот последний шаг, вы обычно рисуете обычный круг с альфой, установленной на 255, а затем, если я смешаю wxBitmap, который является прямоугольным по отношению к буферу, будет скопирован только бит alpha == 255, поэтому я бы получил круговая обрезанная часть изображения Png. - person rui; 17.08.2009
comment
Ссылка, которую я разместил, показывает вам, как использовать wxMemoryDc с wxGraphicsContext. При использовании OpenGL (например) вы должны нарисовать прозрачный круг в альфа-канале изображения перед рисованием изображения. Я ожидаю, что это то, что вам нужно сделать здесь, хотя может не быть хорошей поддержки API для таких вещей. - person Daniel Paull; 18.08.2009
comment
Хм, я попробую этот подход позже. Я вернусь к этой теме с результатами. Спасибо! - person rui; 18.08.2009
comment
Я, вероятно, буду играть с wxGraphicsContext на следующей неделе, поэтому я также посмотрю на альфа-смешивание, если у меня будет шанс. - person Daniel Paull; 20.08.2009