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