真正的技术有关问题,绝不是标题党,大家献计献策.
真正的技术问题,绝不是标题党,大家献计献策...
众所周知,GDI库的几乎所有API(不讨论AlphaBlend)都不能处理32位图像中的ALPHA通道,即使当前屏幕的颜色位深是32位,GDI在绘图时总是把像素的A值自动设置为0。
问题:假设我有一块32位的绘制区域,里面已经有了自己的ALPHA值(假设所有像素的A值都是127),现在我需要用GDI函数往该区域绘制文字或者图形,我希望绘制完成后能维持原有的A值不变(保持127),有哪些方法能做到这一点?哪种方式效率最高?
------解决方案--------------------
//假设我有一块32位的绘制区域 一般 这种区域只有用CreateDibSection能创建出来。这个时候如果想往改区域绘制图像,一般的GDI函数会导致所有的alpha值都重新设置为255,一中方案就是自己写绘制函数,这个不复杂,就是改变DibSection在内存中数据,还有一种是用GDI+,后者的效率值得考虑。
当然,要输出32位图像,用GDI函数只能用AlphaBlend函数,而且AlphaBlend函数所需要的数据室PARGB格式的,我们一般的DibSection中的数据室ARGB的,需要进行一下预处理。用GDI+的话 可以用DRAWIMAGE函数
对于绘制文字我不太了解了。
------解决方案--------------------
------解决方案--------------------
GDI的 效率确实比GDI+在很多方面高很多,这个我深有体会,我在显示24位图像的时候,同样使用最邻近插值算法,strechblt比Drawimage快了很多,但是要显示32位图像,就像我上面说的,只有那两种选择。
你说绘制的种类很多,你举个例子看看,看你有哪些需要绘制的对象(除了文字)。比如想自己实现类似于bitblt,strcheblt之类的也不难的。
------解决方案--------------------
如果不用其他库只能用GDI的话,能想到的就只有写到另一个BITMAP上,然后自己做混合了。因为你说任何GDI操作都会把A抹掉,那么就绝不可以直接在你的dest上使用GDI了。
GDI本身实现的功能就有限,一定要基于这个做一个复杂的渲染引擎,不如直接用已有的,LZ可以试一下Skia
------解决方案--------------------
------解决方案--------------------
ms你那些并不涉及到要操作alpha channel,效率和alpha没关.
只不过你在操作的时候,GDI的绘图函数会把那个byte置0而已.
那已经是另外一个问题,如何提高绘图效率....
什么时候你需要操作这个alpha channel,才是原来的问题中心,因为这个byte会被绘图时置0,貌似GDI能操作这个byte的函数也就只有alphablend(),有没测试过自己合成后BitBlt的效率比起使用alphablend()的效率那个高呢? ms alphablend()这个函数也是颇慢的.
------解决方案--------------------
不懂,学习了,不知道下面是不是楼主的想要的,可能没有懂楼主意义
众所周知,GDI库的几乎所有API(不讨论AlphaBlend)都不能处理32位图像中的ALPHA通道,即使当前屏幕的颜色位深是32位,GDI在绘图时总是把像素的A值自动设置为0。
问题:假设我有一块32位的绘制区域,里面已经有了自己的ALPHA值(假设所有像素的A值都是127),现在我需要用GDI函数往该区域绘制文字或者图形,我希望绘制完成后能维持原有的A值不变(保持127),有哪些方法能做到这一点?哪种方式效率最高?
------解决方案--------------------
//假设我有一块32位的绘制区域 一般 这种区域只有用CreateDibSection能创建出来。这个时候如果想往改区域绘制图像,一般的GDI函数会导致所有的alpha值都重新设置为255,一中方案就是自己写绘制函数,这个不复杂,就是改变DibSection在内存中数据,还有一种是用GDI+,后者的效率值得考虑。
当然,要输出32位图像,用GDI函数只能用AlphaBlend函数,而且AlphaBlend函数所需要的数据室PARGB格式的,我们一般的DibSection中的数据室ARGB的,需要进行一下预处理。用GDI+的话 可以用DRAWIMAGE函数
对于绘制文字我不太了解了。
------解决方案--------------------
------解决方案--------------------
GDI的 效率确实比GDI+在很多方面高很多,这个我深有体会,我在显示24位图像的时候,同样使用最邻近插值算法,strechblt比Drawimage快了很多,但是要显示32位图像,就像我上面说的,只有那两种选择。
你说绘制的种类很多,你举个例子看看,看你有哪些需要绘制的对象(除了文字)。比如想自己实现类似于bitblt,strcheblt之类的也不难的。
------解决方案--------------------
如果不用其他库只能用GDI的话,能想到的就只有写到另一个BITMAP上,然后自己做混合了。因为你说任何GDI操作都会把A抹掉,那么就绝不可以直接在你的dest上使用GDI了。
GDI本身实现的功能就有限,一定要基于这个做一个复杂的渲染引擎,不如直接用已有的,LZ可以试一下Skia
------解决方案--------------------
------解决方案--------------------
ms你那些并不涉及到要操作alpha channel,效率和alpha没关.
只不过你在操作的时候,GDI的绘图函数会把那个byte置0而已.
那已经是另外一个问题,如何提高绘图效率....
什么时候你需要操作这个alpha channel,才是原来的问题中心,因为这个byte会被绘图时置0,貌似GDI能操作这个byte的函数也就只有alphablend(),有没测试过自己合成后BitBlt的效率比起使用alphablend()的效率那个高呢? ms alphablend()这个函数也是颇慢的.
------解决方案--------------------
不懂,学习了,不知道下面是不是楼主的想要的,可能没有懂楼主意义
- C/C++ code
GetObject(hbm,sizeof(BITMAP),&bm); px = new unsigned char[bm.bmHeight*bm.bmWidthBytes]; GetBitmapBits(hMayiRect,bm.bmHeight*bm.bmWidthBytes,px); PixelBytes = bm.bmBitsPixel/8; int rgb; for(int i=0;i<bm.bmHeight;i++) for(int j=j;j<bm.bm.bmHeight;j++) { rgb = i*bm.bmWidthBytes+j*PixelBytes; if(px[rgb]==127&px[rgb+1]==127&&px[rgb+1]==127) { 绘图,填充 } }
------解决方案--------------------
问一下:
1、为啥非得用GDI呢?(其实我个人非常喜欢这种老东西。)
2、为啥不用GDI+或之类的呢?
3、GDI+是安装XP时就自带的么?还是得装什么.net framework之类的?
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
GDI是图形设备接口,侧重的是接口部分,
LZ需要的是绘图函数,所以用GDI的话有点强人所难了,
建议楼主选用其它的技术,
另外我觉得技术无所谓大材小用,又不是用人,