真正的技术有关问题,绝不是标题党,大家献计献策.

真正的技术问题,绝不是标题党,大家献计献策...
众所周知,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库的几乎所有API(不讨论AlphaBlend)都不能处理32位图像中的ALPHA通道,即使当前屏幕的颜色位深是32位,GDI在绘图时总是把像素的A值自动设置为0。

问题:假设我有一块32位的绘制区域,里面已经有了自己的ALPHA值(假设所有像素的A值都是127),现在我需要用GDI函数往该区域绘制文字或者图形,我希望绘制完成后能维持原有的A值不变(保持127),有哪些方法能做到这一点?哪种方式效率最高?

------解决方案--------------------
GDI的 效率确实比GDI+在很多方面高很多,这个我深有体会,我在显示24位图像的时候,同样使用最邻近插值算法,strechblt比Drawimage快了很多,但是要显示32位图像,就像我上面说的,只有那两种选择。


你说绘制的种类很多,你举个例子看看,看你有哪些需要绘制的对象(除了文字)。比如想自己实现类似于bitblt,strcheblt之类的也不难的。

------解决方案--------------------
如果不用其他库只能用GDI的话,能想到的就只有写到另一个BITMAP上,然后自己做混合了。因为你说任何GDI操作都会把A抹掉,那么就绝不可以直接在你的dest上使用GDI了。

GDI本身实现的功能就有限,一定要基于这个做一个复杂的渲染引擎,不如直接用已有的,LZ可以试一下Skia
------解决方案--------------------
探讨
你说的太对了,GDI会忽略ALPHA,但那只是在最终输出到屏幕的时候,在绘制具体形状的时候它没有忽略,而是自作主张地把ALPHA设置为0,冲掉了原有的ALPHA值,这点最令人烦恼,我要解决的就是如何高效地保护原有ALPHA值。

------解决方案--------------------
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之类的?
------解决方案--------------------
探讨
问一下:

1、为啥非得用GDI呢?(其实我个人非常喜欢这种老东西。)

2、为啥不用GDI+或之类的呢?

3、GDI+是安装XP时就自带的么?还是得装什么.net framework之类的?

------解决方案--------------------
探讨
为了效率,我尽量使用系统提供的BLIT函数,它们已经使用了硬件加速,尽量避免在自己的代码中逐像素运算,否则完全失去了硬件加速的优点。我也考虑过直接嵌入 MMX/SSE 指令集执行逐像素运算,问题是没有发现有哪个指令能处理DWORD中的一个字节而维持其它字节不变(也许还没啃透)。

------解决方案--------------------
探讨
做图像处理的并且从来不用GDI的家伙路过!

------解决方案--------------------
GDI是图形设备接口,侧重的是接口部分,
LZ需要的是绘图函数,所以用GDI的话有点强人所难了,
建议楼主选用其它的技术,
另外我觉得技术无所谓大材小用,又不是用人,