----------------------------------
这个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进行的正常混合。
本文代码未作过多优化。
摘自 闲人阿发伯的业余
编程心得
|