2016-12-10 1 views
0

Я пытаюсь вывести изображение PNG с помощью GDI +, MFC. Я хочу вывести его с непрозрачностью 25%. Ниже способ вывода PNG изображения на х = 10, у = 10:Как показать изображение PNG с непрозрачностью 25% с использованием GDI +? (MFC)

CDC *pDC =GetDC(); 
    Graphics graphics(pDC->m_hDC); 
    Image image(L"test1.png", FALSE); 
    graphics.DrawImage(&image, 10, 10); 

Но я не знаю, как сделать его прозрачным. Есть идеи?

+1

Вы спрашиваете два разных вопроса: название наводит на мысль, что вы как-то хотите, альфа-канал изображения, чтобы иметь никакого эффекта, в то время как вопрос, кажется, только хочет, чтобы весь образ был на 25% непрозрачности. Какой вам нужен? – IInspectable

ответ

1

Чтобы нарисовать изображение с альфа-смешивание, объявить Gdiplus::ImageAttributes и Gdiplus::ColorMatrix с требуемым альфа-каналом:

float alpha = 0.25f; 
Gdiplus::ColorMatrix matrix = 
{ 
    1, 0, 0, 0, 0, 
    0, 1, 0, 0, 0, 
    0, 0, 1, 0, 0, 
    0, 0, 0, alpha, 0, 
    0, 0, 0, 0, 1 
}; 

Gdiplus::ImageAttributes attrib; 
attrib.SetColorMatrix(&matrix); 
graphics.DrawImage(&image, 
    Gdiplus::Rect(10, 10, image.GetWidth(), image.GetHeight()), 
    0, 0, image.GetWidth(), image.GetHeight(), Gdiplus::UnitPixel, &attrib); 

Смотрите также: Using a Color Matrix to Transform a Single Color

Обратите внимание, что GetDC() обычно не используется в MFC. Если вы его используете, обязательно звоните ReleaseDC(pDC), когда pDC больше не требуется. Или просто используйте CClientDC dc(this), который имеет автоматическую очистку. Если картина сделана в OnPaint затем использовать CPaintDC, который также имеет автоматическую очистку:

void CMyWnd::OnPaint() 
{ 
    CPaintDC dc(this); 
    Gdiplus::Graphics graphics(dc); 
    ... 
} 
+1

Для Windows 8 и выше альтернативой (более простой и эффективный) является создание [многоуровневого окна] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632599.aspx#layered) для изображения, и пусть система делает тяжелый подъем. – IInspectable