设为首页 加入收藏

TOP

图像(层)正常混合模式详解(下) (二)
2014-11-24 00:36:37 来源: 作者: 【 】 浏览:84
Tags:图像 正常 混合 模式 详解
raphics(Canvas->Handle);
g->DrawImage(newBmp, 0, 0);

delete g;
delete source;
delete dest;
delete newBmp;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
BitmapData data, dst, src;

// 建立新图像
Gdiplus::Bitmap *newBmp = new Gdiplus::Bitmap(768, 256, PixelFormat32bppARGB);
LockBitmap(newBmp, &data);

// 合成目标到新图左边
Gdiplus::Bitmap *dest = new Gdiplus::Bitmap(L"d:\\xmas_011.png");
LockBitmap(dest, &dst);
ImageMixer(&data, 0, 0, &dst, 255);

// 合成源图到新图中间
Gdiplus::Bitmap *source = new Gdiplus::Bitmap(L"d:\\Apple.png");
LockBitmap(source, &src);
ImageMixer(&data, dest->GetWidth(), 0, &src, 255);

// 目标图与源图混合
ImageMixer(&dst, &src, 192);

// 混合后的目标图合成到新图右边
ImageMixer(&data, dest->GetWidth() << 1, 0, &dst, 255);
UnlockBitmap(source, &src);
UnlockBitmap(dest, &dst);
UnlockBitmap(newBmp, &data);

// 显示拼接后的图像
Gdiplus::Graphics *g = new Gdiplus::Graphics(Canvas->Handle);
g->DrawImage(newBmp, 0, 0);

delete g;
delete source;
delete dest;
delete newBmp;
}
//---------------------------------------------------------------------------

运行效果截图如下:

\

运行效果与《图像(层)正常混合模式详解(上)》例子运行效果截图是一样的(其实就是同一张图片),但含义却是不一样的:《图像(层)正常混合模式详解(上)》例子是分多次在窗口上显示,而上面例子却是将源图和目标图拼接(多次混合)到一张图上,然后再显示。

其实,上面的ImageMixer函数没有对源图进行混合坐标定位,也是不太完善的,不过有了GetSubBitmapData函数,对源图进行坐标定位是很简单的。

下面再应用ImageMixer函数实现图像显示功能,代码如下:


VOID GetBitmapInfoHeader(CONST BitmapData *data, CONST PBITMAPINFO pbi)
{
pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbi->bmiHeader.biWidth = data->Width;
pbi->bmiHeader.biHeight = data->Height;
pbi->bmiHeader.biPlanes = 1;
pbi->bmiHeader.biBitCount = (data->PixelFormat >> 8) & 0xff;
pbi->bmiHeader.biCompression = BI_RGB;
}
//---------------------------------------------------------------------------

VOID GetDCImageData(HDC DC, INT x, INT y, BitmapData *data, PBITMAPINFO pbi)
{
HBITMAP bitmap = CreateCompatibleBitmap(DC, data->Width, data->Height);
HDC memDC = CreateCompatibleDC(DC);
HBITMAP saveBitmap = (HBITMAP)SelectObject(memDC, bitmap);
BitBlt(memDC, 0, 0, data->Width, data->Height, DC, x, y, SRCCOPY);
SelectObject(memDC, saveBitmap);
DeleteDC(memDC);
GetDIBits(DC, bitmap, 0, data->Height, data->Scan0, pbi, DIB_RGB_COLORS);
DeleteObject(bitmap);
}
//---------------------------------------------------------------------------

VOID BitBltImageData(HDC DC, INT x, INT y, CONST BitmapData *data, PBITMAPINFO pbi)
{
HBITMAP bitmap = CreateDIBitmap(DC, &pbi->bmiHeader, CBM_INIT, data->Scan0, pbi, DIB_RGB_COLORS);
HDC memDC = CreateCompatibleDC(DC);
HBITMAP saveBitmap = (HBITMAP)SelectObject(memDC, bitmap);
BitBlt(DC, x, y, data->Width, data->Height, memDC, 0, 0, SRCCOPY);
SelectObject(memDC, saveBitmap);
DeleteDC(memDC);
DeleteObject(bitmap);
}
//---------------------------------------------------------------------------

VOID ImageDraw(HDC DC, INT x, INT y, CONST BitmapData *data, float alpha = 1.0f)
{
BITMAPINFO bi;
RECT r;
INT alphaI;
LPVOID scan0;
BitmapData dst, src, tmp;
// 获取DC可见矩形
if (GetClipBox(DC, &r) <= NULLREGION)
return;
alphaI = (INT)(alpha * 255);
// 如果alpha=1,同时data不含alpha信息,同时d

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Micro2440/Mini2440 linux下蜂鸣(.. 下一篇终端对非打印字符的显示方式的有..

评论

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