图像(层)正常混合模式详解(上)(三)

2014-11-24 00:36:40 · 作者: · 浏览: 121
----------------------------------
这个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进行的正常混合。

本文代码未作过多优化。

摘自 闲人阿发伯的业余 编程心得