我有一个指向32位argb图像像素数据和32位xrgb图像像素数据的指针。如何在使用alpha组件的同时在xrgb图像上合成argb?
Visual Studio 2008 C++
编辑:
有没有比这更快(更快处理)的合成方法:
float alpha = (float)Overlay[3] / 255;
float oneLessAlpha = 1 - alpha;
Destination[2] = (Overlay[2] * alpha + Background[2] * oneLessAlpha);
Destination[1] = (Overlay[1] * alpha + Background[1] * oneLessAlpha);
Destination[0] = (Overlay[0] * alpha + Background[0] * oneLessAlpha);发布于 2010-06-11 05:39:52
这取决于你想要实现的目标。你可以假设你的第二张图片的alpha在任何地方都是255,然后通过线性插值/ alpha混合来合成每个像素(假设浮点值为0,1,相应地调整):
out(x,y) = argb(x,y).rgb * argb(x,y).a + xrgb(x,y).rgb * (1.-argb(x.y).a)这样,从argb图像中没有透明度的所有像素将始终显示在“顶部”,而具有完全透明度的像素是不可见的,并由来自xrgb像素的像素替换。中间的所有像素都是线性混合的。
发布于 2010-06-11 06:59:49
下面是一些或多或少应该可以工作的代码(没有对其进行测试,这台机器上没有编译器...)。
DWORD* pSrc; // Pointer to current row of ARGB bitmap
DWORD* pDst; // Pointer to current row of XRGB bitmap
...
BYTE* src_r = GetRValue(*pSrc);
BYTE* src_g = GetGValue(*pSrc);
BYTE* src_b = GetBvalue(*pSrc);
BYTE* src_a = *pSrc >> 24;
BYTE* dst_r = GetRValue(*pDst);
BYTE* dst_g = GetGValue(*pDst);
BYTE* dst_b = GetBvalue(*pDst);
BYTE* dst_a = 255 - src_a;
*pDst = RGB(((src_r * src_a) + (dst_r * dst_a)) >> 8,
((src_g * src_a) + (dst_g * dst_a)) >> 8,
((src_b * src_a) + (dst_b * dst_a)) >> 8);https://stackoverflow.com/questions/3018585
复制相似问题