使用 AlphaBlend() 和 FillRect()
所以,我正在使用 AlphaBlend( ) 将矩形从一个 HBITMAP 复制到另一个。
它有效,但有一个问题。每当我使用 FillRect() 函数时,HBITMAP 中的 alpha 值每次都会猛烈地变为 0。
因此,在每次调用像 FillRect() 这样的 Win32 api 函数之后,我必须调用 GetDIBits(),将 alpha 重置回 255,然后调用 SetDIBits()。
那么,有没有办法创建 HBRUSH 或以其他方式告诉 FillRect() 不要触摸它将要绘制到的 HBITMAP 中的 Alpha 通道值?
So, I'm using AlphaBlend() to copy a rectangle from one HBITMAP to another.
It works, but there is a problem. Whenever I use the FillRect() function, the alpha values in the HBITMAP get slammed out to 0. Everytime.
So I have to GetDIBits(), reset the alpha back to 255, and then SetDIBits(), after every call to the Win32 api functions like FillRect().
So, is there a way to create an HBRUSH or otherwise tell FillRect() not to touch the alpha channel values in the HBITMAP it is going to be drawing to?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
除了 AlphaBlend 之外...BitBlt 是唯一一个能够以任何方式保留 Alpha 通道的 GDI 函数。
因此,您的选择基本上是:
切换到使用 DIBSections。这并不能解决 GDI api 覆盖 alpha 通道的基本问题,但作为 DIBSection,您可以避免昂贵的 DDB -> DIB->需要 DDB 转换来修补 Alpha 通道。 DIBSections 使您可以访问 HBITMAP 和存储位图位的内存部分。
使用 Alpha 感知绘画 API,例如 GdiPlus 而不是 GDI。
With the exception of AlphaBlend... BitBlt is the only other GDI function that will preserve the alpha channel in any way.
Your options basically therefore are:
Switch to using DIBSections. This will not solve the basic problem of GDI apis overwiting the alpha channel, but as a DIBSection you can avoid the costly DDB -> DIB -> DDB transformation needed to patch up the alpha channel. DIBSections give you access to both an HBITMAP and a memory section where the bitmaps bits are stored.
Use an alpha aware painting API like GdiPlus instead of GDI.