【问题标题】:How to draw a PNG in GDI+ and maintain transparency/alpha channel如何在 GDI+ 中绘制 PNG 并保持透明度/alpha 通道
【发布时间】:2013-09-17 08:39:47
【问题描述】:

基本上,当直接在纯色表面上绘制时,具有 alpha 的图像可以正确绘制,但是当它碰到窗口透明的区域时,具有 alpha 值的 PNG 开始具有白色背景。

希望我的代码能帮助你们破译发生了什么。非常感谢所有帮助。

GDI+ 绘图

Image indicator(L"resources\\images\\floating_icon [a] 1.png", FALSE);
g.DrawImage(&indicator, 0, 0);

TextureBrush myTextureBrush(&indicator);
g.FillRectangle(&myTextureBrush, WindowPadding, 50, WindowDim.right - WindowPadding * 2, WindowPadding);

窗口属性

hWnd = CreateWindowEx(0, szWindowClass, szTitle, WS_POPUP | WS_OVERLAPPED,
    0, 0, WindowDim.right, WindowDim.bottom, NULL, NULL, hInstance, NULL);

SetLayeredWindowAttributes(hWnd, RGB(255, 255, 255), 0,
    LWA_COLORKEY);

【问题讨论】:

    标签: c++ c winapi gdi+


    【解决方案1】:

    如果您的底层位图是纯白色 (255,255,255),那么当您在其上绘制 alpha 图像时,您最终会得到一种不是纯白色的颜色(除非像素完全透明)-图像与背景的基础颜色混合。

    这样做的问题是您的颜色键只会使纯白色像素透明,而其他任何东西都是实心的。

    解决方案是为您的分层窗口切换到使用每像素 Alpha。

    【讨论】:

    • 如何为我的分层窗口切换到每像素 Alpha?
    • 我知道你会使用UpdateLayeredWindow,但我不知道如何对其进行 UI 更改,因为我不会在 WM_PAINT 中调用它。基本上,如果我使用UpdateLayeredWindow,如何调用函数来重绘屏幕?
    猜你喜欢
    • 2019-03-18
    • 2010-12-30
    • 2012-03-29
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2011-03-19
    • 2010-11-03
    • 2012-11-24
    相关资源
    最近更新 更多