将一张透明的小图覆盖到大图上!

babam 2004-07-28 10:49:32
如题!希望有成熟的代码段
...全文
343 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
酒红绿叶 2004-09-07
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=532
xxduan 2004-09-06
  • 打赏
  • 举报
回复
如果你不希望程序是独占模式,可采用directx的镂空做法。独占模式可采用色键。
tyj7878 2004-08-13
  • 打赏
  • 举报
回复

如果要对像素进行处理在16位色时,要注意565和555的格式
csdn_cht 2004-08-07
  • 打赏
  • 举报
回复
什么鬼东西?
看不懂!

......






















































还真是好东西,呵呵,不错!
qiushenwei88 2004-08-07
  • 打赏
  • 举报
回复
好东西!
tyj7878 2004-08-06
  • 打赏
  • 举报
回复
LPDIRECTDRAWSURFACE7 DDSur;
DDSURFACEDESC2 DDde;
LPDIRECTDRAW7 DD;

DirectDrawCreateEx(NULL, (VOID**)&DD, IID_IDirectDraw7, NULL);//建立 DirectDraw 对象
DD->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );//设定协调等级
SetDisplayMode(1024,768,16,0,DDSDM_STANDARDVGAMODE); //设定显示模式

//建立主绘图页
memset(&DDde,0,sizeof(DDde));
DDde.dwSize = sizeof(DDde);
DDde.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
DDde.dwBackBufferCount = 2;
DDde.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP|DDSCAPS_VIDEOMEMORY;
DD->CreateSurface(&DDde,&DDSur,NULL);

//连结后缓冲区
DDcaps.dwCaps = DDSCAPS_BACKBUFFER;
DDSur->GetAttachedSurface(&DDcaps,&DDBuf);

//声明幕后幕存区的共同特性
memset(&DDde,0,sizeof(DDde));
DDde.dwSize = sizeof(DDde);
DDde.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
DDde.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;


//面
DDde.dwWidth=1024;
DDde.dwHeight=768;
DD->CreateSurface(&DDde, &DDSur, NULL);

//设颜色键值
key.dwColorSpaceHighValue = RGB(200,0,200);
key.dwColorSpaceLowValue = RGB(255,0,255);
DDSur->SetColorKey(DDCKEY_SRCBLT,&key);

后面用LoadImage()将图载入到DDSur面
DDSur->SetColorKey(DDCKEY_SRCBLT,&key);//设透明
用BltFast(DDBLTFAST_SRCCOLORKEY);//到幕后缓冲
再用Flip();//翻页就可以了





tyj7878 2004-08-06
  • 打赏
  • 举报
回复
也可以设了颜色键值之后,用BLT(DDBLTFAST_SRCCOLORKEY)是最快最简单的!
tyj7878 2004-08-06
  • 打赏
  • 举报
回复
HDC hdc1,hdc2;

m_bf.BlendFlags=0;
m_bf.AlphaFormat=0;
m_bf.SourceConstantAlpha=透明度

DDBuf1->GetDC(&hdc1);
DDBuf2->GetDC(&hdc2);
AlphaBlend(hdc1,0,0,250,250,hdc2,0,0,250,250,m_bf);
DDBuf1->ReleaseDC(hdc1);
DDBuf2->ReleaseDC(hdc2);

aspirerME 2004-08-03
  • 打赏
  • 举报
回复
网上现成的函数
void CDesignDlg::TransparentBlt2(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

// 将源DC中的位图拷贝到临时DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

// 设置透明色
SetBkColor(hImageDC, crTransparent);

// 生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

// 生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// 透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(255,255,255));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// "或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

// 清理、恢复
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
hxy2003 2004-08-03
  • 打赏
  • 举报
回复
关注
babam 2004-07-28
  • 打赏
  • 举报
回复
名字还真没有取错
lchlovely 2004-07-28
  • 打赏
  • 举报
回复
需要用到掩碼,AlphBend,

如需要代碼,則需要money.
babam 2004-07-28
  • 打赏
  • 举报
回复
怎么作成透明的呢?
酒红绿叶 2004-07-28
  • 打赏
  • 举报
回复
我没有成熟的,,
但是我有把小图贴在大图上的,可能把小图做成透明就可以了把!!
要得话加我9404814
jyc_nj 2004-07-28
  • 打赏
  • 举报
回复
上述代码就是AlphaBlend的一个例子.
自己准备两幅位图资源IDB_BITMAP1,IDB_BITMAP2.
m_nAlpha2和m_nAlpha是源和目标的Alpha值, 你可以试着改这两个值,看看结果.
我觉得一般, 把m_nAlpha=255,改m_nAlpha2就可以达到从透明到不透明的效果了.
jyc_nj 2004-07-28
  • 打赏
  • 举报
回复
CBitmap bmp1, bmp2;
CBitmap *pOldBmp1, *pOldBmp2;
bmp1.LoadBitmap(IDB_BITMAP1);
//bmp2.LoadBitmap(IDB_BITMAP2);
BITMAP bmpInfo;
bmp1.GetBitmap(&bmpInfo);

//
CDC MemDC1, MemDC2;
MemDC1.CreateCompatibleDC(pDC);
pOldBmp1 = MemDC1.SelectObject(&bmp1);

MemDC2.CreateCompatibleDC(pDC);
// bmp2.CreateBitmap(bmpInfo.bmWidth, bmpInfo.bmHeight,
// 1, 32, NULL);
HBITMAP hBmp2;
BITMAPINFO bmpInfo2;
memset(&bmpInfo2, 0, sizeof(BITMAPINFO));
bmpInfo2.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo2.bmiHeader.biWidth = bmpInfo.bmWidth;
bmpInfo2.bmiHeader.biHeight = bmpInfo.bmHeight;
bmpInfo2.bmiHeader.biPlanes = 1;
bmpInfo2.bmiHeader.biBitCount = 32 ;
bmpInfo2.bmiHeader.biCompression = BI_RGB;
bmpInfo2.bmiHeader.biClrUsed = 0;

void *pBit2;
hBmp2 = ::CreateDIBSection(pDC->GetSafeHdc(), &bmpInfo2, DIB_RGB_COLORS,
&pBit2, NULL, 0);
bmp2.Attach(hBmp2);

pOldBmp2 = MemDC2.SelectObject(&bmp2);
MemDC2.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
&MemDC1, 0, 0, SRCCOPY);
//MemDC1.FillSolidRect(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, RGB(255,0,0));
MemDC1.SelectObject(pOldBmp1);
bmp1.DeleteObject();
bmp1.LoadBitmap(IDB_BITMAP2);
pOldBmp1 = MemDC1.SelectObject(&bmp1);


//deal with alpha channel
BITMAP tmp;
bmp2.GetBitmap(&tmp);
LPBYTE lpDst, lpDstTmp;
LONG lDstStride = tmp.bmWidthBytes;
lpDst = (LPBYTE)pBit2;
LONG i, j;
BYTE alpha = m_nAlpha2;
for( j = 0 ; j < bmpInfo.bmHeight; ++j )
{
lpDstTmp = lpDst;
lpDstTmp += 3;
for( i = 0 ; i < bmpInfo.bmWidth; ++i )
{
*lpDstTmp = alpha;
lpDstTmp+=4;
}
lpDst += lDstStride;
}

BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = m_nAlpha;
bf.AlphaFormat = AC_SRC_ALPHA;
BOOL br;
br = ::AlphaBlend(MemDC1.GetSafeHdc(), 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
MemDC2.GetSafeHdc(), 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
bf);

pDC->BitBlt(bmpInfo.bmWidth, 0,
bmpInfo.bmWidth, bmpInfo.bmHeight,
&MemDC1, 0, 0, SRCCOPY);

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧