设为首页 加入收藏

TOP

图像(层)正常混合模式详解(上)(二)
2014-11-24 00:36:40 来源: 作者: 【 】 浏览:103
Tags:图像 正常 混合 模式 详解
--------------------------------------------
// source alpha = false, dest alpha = true, alpha < 255
static VOID Mixer2(PImageCpyData cpyData, INT alpha)
{
PARGBQuad pd = cpyData->dstScan0;
PARGBQuad ps = cpyData->srcScan0;
for (INT y = 0; y < cpyData->height; y ++, pd += cpyData->dstOffset, ps += cpyData->srcOffset)
{
for (INT x = 0; x < cpyData->width; x ++, pd ++, ps ++)
{
pd->Blue = (pd->Blue * pd->Alpha + 127) / 255;
pd->Green = (pd->Green * pd->Alpha + 127) / 255;
pd->Red = (pd->Red * pd->Alpha + 127) / 255;

pd->Blue += (((ps->Blue - pd->Blue) * alpha + 127) / 255);
pd->Green += (((ps->Green - pd->Green) * alpha + 127) / 255);
pd->Red += (((ps->Red - pd->Red) * alpha + 127) / 255);
pd->Alpha += (alpha - (pd->Alpha * alpha + 127) / 255);

pd->Blue = pd->Blue * 255 / pd->Alpha;
pd->Green = pd->Green * 255 / pd->Alpha;
pd->Red = pd->Red * 255 / pd->Alpha;
}
}
}
//---------------------------------------------------------------------------
// source alpha = true, dest alpha = false, alpha < 255
static VOID Mixer4(PImageCpyData cpyData, INT alpha)
{
PARGBQuad pd = cpyData->dstScan0;
PARGBQuad ps = cpyData->srcScan0;
for (INT y = 0; y < cpyData->height; y ++, pd += cpyData->dstOffset, ps += cpyData->srcOffset)
{
for (INT x = 0; x < cpyData->width; x ++, pd ++, ps ++)
{
INT alpha0 = (alpha * ps->Alpha + 127) / 255;
pd->Blue += (((ps->Blue - pd->Blue) * alpha0 + 127) / 255);
pd->Green += (((ps->Green - pd->Green) * alpha0 + 127) / 255);
pd->Red += (((ps->Red - pd->Red) * alpha0 + 127) / 255);
}
}
}
//---------------------------------------------------------------------------
// source alpha = true, dest alpha = false, alpha = 255
static VOID Mixer5(PImageCpyData cpyData, INT alpha)
{
PARGBQuad pd = cpyData->dstScan0;
PARGBQuad ps = cpyData->srcScan0;
for (INT y = 0; y < cpyData->height; y ++, pd += cpyData->dstOffset, ps += cpyData->srcOffset)
{
for (INT x = 0; x < cpyData->width; x ++, pd ++, ps ++)
{
pd->Blue += (((ps->Blue - pd->Blue) * ps->Alpha + 127) / 255);
pd->Green += (((ps->Green - pd->Green) * ps->Alpha + 127) / 255);
pd->Red += (((ps->Red - pd->Red) * ps->Alpha + 127) / 255);
}
}
}
//---------------------------------------------------------------------------
// source alpha = true, dest alpha = true, alpha < 255
static VOID Mixer6(PImageCpyData cpyData, INT alpha)
{
PARGBQuad pd = cpyData->dstScan0;
PARGBQuad ps = cpyData->srcScan0;
for (INT y = 0; y < cpyData->height; y ++, pd += cpyData->dstOffset, ps += cpyData->srcOffset)
{
for (INT x = 0; x < cpyData->width; x ++, pd ++, ps ++)
{
INT alpha0 = (alpha * ps->Alpha + 127) / 255;
if (alpha0)
{
pd->Blue = (pd->Blue * pd->Alpha + 127) / 255;
pd->Green = (pd->Green * pd->Alpha + 127) / 255;
pd->Red = (pd->Red * pd->Alpha + 127) / 255;

pd->Blue += (((ps->Blue - pd->Blue) * alpha0 + 127) / 255);
pd->Green += (((ps->Green - pd->Green) * alpha0 + 127) / 255);
pd->Red += (((ps->Red - pd->Red) * alpha0 + 127) / 255);
pd->Alpha += (alpha0 - (pd->Alpha * alpha0 + 127) / 255);

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇网络编程client和server 下一篇Beej’s Guide Network to Progra..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: