当前位置: 代码迷 >> Windows Mobile >> gdi操作时的alpha通道解决思路
  详细解决方案

gdi操作时的alpha通道解决思路

热度:117   发布时间:2016-04-25 08:01:42.0
gdi操作时的alpha通道
gdi的所有操作(AlphaBlend除外)针对32位位图,都是忽略alpha通道的,也就是32位的bitmap上画东西,它是不管alpha值是多少,都会将它设置为0。
有没有办法让它不修改alpha通道,原来是多少就是多少。

------解决方案--------------------
这就是为啥Google要搞Skia的原因之一。
GDI太弱,GDI+又慢;这俩东西又都不跨平台。
------解决方案--------------------
好好这个
详细告诉你IImage怎么用。

------解决方案--------------------
首先,alpha值应该是被默认为1吧?
其次,想使用alpha值绘制透明等效果的话,要使用alpha融合。
GDI没用过,Direct3D里面是这样实现的
------解决方案--------------------
唉~~
告诉你个万能招数吧,首先把你当前背景CreateDIBSection一张DIB图片,参数中有个内存指针,那个是图片的内存指针。
之后,你的图片源载到内存里,根据ALPHA通道与背景图片融合。
再将刚才的DIB拷贝到你当前屏幕上。这样就完成了一次绘图。

另外,IImage是每次画图都要进行解压,确实不好,如果你底图是单色,可以将画完的图片保存起来每次都贴上也行。

PS:如果BMP可以设置透明色,单色背景可以过滤掉。
------解决方案--------------------
贴段代码:算是第一步。
C/C++ code
        m_pDeviceBuffer = NULL;    BITMAPINFO bmp_info;     bmp_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);     bmp_info.bmiHeader.biWidth = width;     bmp_info.bmiHeader.biHeight = 0 - height;     bmp_info.bmiHeader.biPlanes = 1;     bmp_info.bmiHeader.biBitCount = DEFAULT_WIN32_BPP * BITS_PER_BYTE;     bmp_info.bmiHeader.biCompression = BI_RGB;    bmp_info.bmiHeader.biSizeImage = 0;     bmp_info.bmiHeader.biXPelsPerMeter = 0;     bmp_info.bmiHeader.biYPelsPerMeter = 0;     bmp_info.bmiHeader.biClrUsed = 0;     bmp_info.bmiHeader.biClrImportant = 0;     m_hdc = ::CreateCompatibleDC(NULL);    m_bmp = ::CreateDIBSection(         m_hdc,         &bmp_info,         DIB_RGB_COLORS,         (void **)&m_pDeviceBuffer,         0,         0         );
------解决方案--------------------
探讨
IIMAGE主要的就是LOAD的时候慢,DRAW的时候还可以。

------解决方案--------------------
IIMAGE Draw位图不慢吧,Draw png图片挺慢
------解决方案--------------------
PNG之所以Load慢,是因为解码慢,更新移动设备处理速度慢~~~
常用的图就缓冲着吧~~~
------解决方案--------------------
只要是用了GDI函数,你这个缓存就不可能是透明的。
  相关解决方案