以前一直想尝试类似于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在析构的时候就已经自动释放所有图层的内存了。
本文介绍如何利用CxImage库实现类似Photoshop的多图层显示,并且探讨了图层的透明度混合效果。作者通过自我探索,成功实现了这一功能,并分享了其实现过程。
3577





