CxImage实现多图层半透明混合显示

本文介绍如何利用CxImage库实现类似Photoshop的多图层显示,并且探讨了图层的透明度混合效果。作者通过自我探索,成功实现了这一功能,并分享了其实现过程。

以前一直想尝试类似于PS的图层管理,特别是让图层以一定的透明度混合显示的效果。当时觉得自己写太麻烦,就放弃了,现在既然有了CxImage,就很想尝试能否用CxImage来实现这个效果。在网上搜索,没见到相关的说明,最后折腾了好久,才自己尝试出来,现在写出来分享一下。

#include "stdafx.h"
//获取文件后缀名所需要的库
BOOL CCxImageMFCDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;

	// TODO:  在此添加您专用的创建代码
	//m_ximage是一个CxImage的对象
	char drive[MAX_LENGTH],dir[MAX_LENGTH],fname[MAX_LENGTH],ext[MAX_LENGTH];
	_splitpath(lpszPathName,drive,dir,fname,ext);
	//网上很多获取后缀名是自己写的字符串处理,但是我还是觉得提供的库更好用
	uint32_t uImgType= CxImage::GetTypeIdFromName(ext);
	//CxImage通过后缀名获取类型
	m_ximage.LayerCreate();
	//首先要创建图层,在创建图层时就动态创建了一个CxImage,详情可见源代码
	CxImage * pImageLayer=m_ximage.GetLayer(-1);
	//-1代表获取最后一个图层,也就是最新获取的,这里获得指针
	pImageLayer->Load(lpszPathName,uImgType);
	//用这个图层打开图像
	if (pImageLayer->IsValid()==false)
	{
		return FALSE;
	}
	pImageLayer->AlphaCreate();
	//创建一个Alpha图层,其实我也不太懂这个Alpha图层是什么,但是可以透明化
	pImageLayer->AlphaSet(200);
	//设置透明度为200,这个值得范围是0-255,0为全透明,255为不透明
	return TRUE;
}

以上是打开多个图片,下面是将这些图片绘制出来。

void CCxImageMFCView::OnDraw(CDC* /*pDC*/)
{
	CCxImageMFCDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CClientDC dc(this);
        //这里只能使用判断图层数量的方法
	if (pDoc->m_ximage.GetNumLayers()>0)
	{
		CRect rect;
		CRect mrect(0,0,500,500);
		//画出图片500*500大小的范围
		GetClientRect(&rect);
		pDoc->m_ximage.LayerDrawAll(dc.GetSafeHdc(),rect,mrect);
	}
}

这里将所有图层的图片都画出了500*500大小的范围。需要提醒的只有一点,就是画图时使用的是LayerDrawAll()函数。

我曾经考虑过是否需要自己来释放图层内存,但是看了源代码之后发现不需要,CxImage在析构的时候就已经自动释放所有图层的内存了。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值