设为首页 加入收藏

TOP

图像(层)正常混合模式详解(上)(三)
2014-11-24 00:36:40 来源: 作者: 【 】 浏览:106
Tags:图像 正常 混合 模式 详解
----------------------------------
这个ImageMixer函数只保留了3个调用子函数,其中,Mixer6是完全的正常混合模式,即前面公式3的实现;Mixer4为对不含Alpha信息目标图的混合,即在公式4基础上稍稍扩充了的情况;而Mixer1则为拷贝模式。
下面是采用BCB2007和GDI+调用ImageMixer函数的例子:

//---------------------------------------------------------------------------

// 锁定GDI+位位图扫描线到data
FORCEINLINE
VOID LockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)
{
Gdiplus::Rect r(0, 0, bmp->GetWidth(), bmp->GetHeight());
BOOL hasAlpha = bmp->GetPixelFormat() & PixelFormatAlpha;
bmp->LockBits(&r, ImageLockModeRead | ImageLockModeWrite,
PixelFormat32bppARGB, data);
if (hasAlpha) data->Reserved |= PixelAlphaFlag;
}
//---------------------------------------------------------------------------

// GDI+位图扫描线解锁
FORCEINLINE
VOID UnlockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)
{
data->Reserved &= 0xff;
bmp->UnlockBits(data);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

Gdiplus::Bitmap *dest = new Gdiplus::Bitmap(L"d:\\xmas_011.png");
Gdiplus::Bitmap *source = new Gdiplus::Bitmap(L"d:\\Apple.png");

Gdiplus::Graphics *g = new Gdiplus::Graphics(Canvas->Handle);
g->DrawImage(dest, 0, 0);
g->DrawImage(source, dest->GetWidth(), 0);

BitmapData dst, src;
LockBitmap(dest, &dst);
LockBitmap(source, &src);
ImageMixer(&dst, &src, 192);
UnlockBitmap(source, &src);
UnlockBitmap(dest, &dst);

g->DrawImage(dest, dest->GetWidth() << 1, 0);

delete g;
delete source;
delete dest;
}
//---------------------------------------------------------------------------
下面是运行效果截图:

\

左边是目标图,中间是源图,右边是源图按不透明度192进行的正常混合。

本文代码未作过多优化。

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

评论

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