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

来源:互联网 发布:vscode路径插件 编辑:程序博客网 时间:2024/04/30 20:36

以前一直想尝试类似于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在析构的时候就已经自动释放所有图层的内存了。

原创粉丝点击