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可以设置透明色,单色背景可以过滤掉。
[解决办法]
贴段代码:算是第一步。
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 );
[解决办法]