CXimage

先吃饭去,回来写个总结吧。

昨天偷懒,今天写总结。

字写得有点小,看着比较费力气的Ctrl+鼠标滑轮

—————————————————————————————————————————————————————————

【开发环境】vs2005

【编译生成】

下载http://www.xdp.it/cximage/
cximage600_full,这个包用vs2005打开,首先转换,然后进行编译(如果你不需要其中的某些功能,自己参考http://www.codeproject.com/KB/graphics/cximage.aspx配置,我就不在叙说了),里面有13个工程
CXimage_第1张图片
每个工程都对应四个编译模式:
CXimage_第2张图片
对应于每种编译模式都有相应的设置,你可以右键单击一个工程》属性》配置属性》常规进行查看:
CXimage_第3张图片
里面涉及到每种模式的配置类型,在MFC中使用方式,使用的字符集,当然,在版本发布的时候已经给你设置好了,你需要做的就是查看了解。然后进行:生成》批生成》全选》生成,等待一些时间,等到所有工程的所有模式都生成完毕,13个工程自然是52种了。成功编译后,开始使用



 【使用】 【在动态链接库中的使用】
动态链接,当然需要dll文件,也需要lib
1.找到需要的lib:你存放的目录\cximage600_full\CxImage\CxImageDLL有Debug,Release
Unicode_Debug,Unicode_Release四个文件夹,每个文件夹下有两个lib,例如Debug文件夹下就有cximaged.lib(用于MFC工程中)和cximagecrtd.lib(win32控制台),你的工程是什么样的工程,是什么模式的工程,就拷出对应的lib放到自己建立的一个目录下:E:\MyCxImage\Lib。
2.找到需要的Dll:你存放的目录\cximage600_full\bin下面有8个dll,分别对应CRT和MFC的四种模式需要的动态链接库,可以根据名字悟出来是MFC还是CRT,是Unicode(u),Debug(d)模式,这个不能再菜了。
找到了,成功了一半。
3.找到头文件:你存放的目录\cximage600_full\CxImage所有头文件拷出来,放到自己建立的一个目录下:E:\MyCxImage\Header
4.新建工程,以MFC工程,多字节,Debug模式为例:
随便搞搞,建好之后,查看项目》属性》配置属性》常规中的配置,”MFC的使用“ 为 ”在共享Dll中“,然后设置字符集为多字节;将配置为Debug,默认就是。
在项目》属性》配置属性》c/c++》常规》附加包含目录添加上E:\MyCxImage\Header;在项目》属性》配置属性》链接器》常规》附加库目录中添加E:\MyCxImage\Lib;在项目》属性》配置属性》链接器》输入》附加依赖项添加cximaged.lib;在需要使用cximage库的头文件中加入#include "ximage.h",将cximaged.dll拷到源文件所在目录,或者生成的应用程序所在目录。
5.随便写上几个语句测试:
在***.cpp中添加:
CxImage *pxImage=new cxImage;
pxImage->Load("..\\3.jpg",CXIMAGE_FORMAT_JPG);
pxImage->Save("..\\3.bmp",CXIMAGE_FORMAT_BMP);
delete pxImage;
运行程序,and Enjoy。
;
【在静态链接库中的使用】
>_<,累了,也没测试,先不写了,动态链接库挺好使,先不写了

——————————————————————————————————————————————————————————

 【开发环境】vs2010

类似vs2005,发现一个编译好的软件包,大家省事改东西了。程序员联合开发网的,需要账号,奇怪的是现在只能用快照打开,而且下载不快。

http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f7217b818c027fa3c215cc790d160135b8e530256444c4c50b3440ed5e5d9eab6065367523b790cc8a4adcafd7756fde28653a47d91247840eafba0264d621e05aebac1b&p=882a96458d8212a05eb4c22b4c54&user=baidu&fm=sc&query=cximage+vs2010&qid=b55f3da114712c2c&p1=1





VC++基于CXImage库实现缩略图  

2007-08-02 20:32:33|  分类: 编程经典文摘 |字号 订阅

       一般的图像处理软件都对读入程序的图像文件建一个缩略图的列表,像ACDSee那样。笔者最近在做一个图像处理的项目,处理的原始数据就是图像文件。从项目一开始就想做一个缩略图,但一直苦于技术水平有限,且时间也不允许。最近两天闲暇之余就Google,百度了一下,仔细研究了一下缩略图的实现方法。其实用VC++实现一个缩略图的思想并不复杂。就是分两步:1.创建CListCtrl控件和CImageList图像列表,设置各自的相应属性。2.将你要显示的图像文件的缩略图做好,并制成位图文件加入到CImageList中,然后将每个图像文件设置成一个Item插入到CListCtrl中就完成了缩略的的制作。剩下的你就可以写各个消息的处理方法,以响应你对缩略图的操作。

       说起来简单,但当笔者亲自实现时却遇到了许多的麻烦,最大的麻烦就是如何在内存里制作缩略图,如何将各个图像文件的缩略图制成Bitmap位图资源(因为CImageList只能加入位图资源)。笔者在内存中操作了半天,最后还是没成功。而且最大的问题是在内存中由于调色板的原因,在内存中画好的图像是黑白的。最后我想到了我们这个项目中应用的CXImage图像处理库了。我仔细的读了一下这个库的文档,正所谓“踏破铁鞋无觅处,得来全不费工夫”,我发现可以基于这个库提供的方法,很简单的实现缩略图。原理还是这个原理,只是应用CXImage后,原来的问题一一化解,原来的操作也更简单了。下面就把实现的过程及代码贴出来,以飨读者。

程序所达到的效果:

CXimage_第4张图片

1.创建CListCtrl控件和CImageList图像列表,设置各自的相应属性。对于我的程序我是在图中左面的视图的OnCreate中动态创建的CListCtrl控件和CImageList图像列表的。

int CWorkspaceBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CBCGPDockingControlBar::OnCreate(lpCreateStruct) == -1)
  return -1;
 
 CRect rectDummy;
 rectDummy.SetRectEmpty ();

 // Create tree windows.
 //动态生产列表控件和图像列表
 m_ListCtl.Create(LVS_ICON|WS_CHILD | WS_VISIBLE|LVS_TYPEMASK,
                                 CRect(0,0,150,500),this,100);
 m_MyImageList.Create(64,64,ILC_COLOR24, 0, 1);
 
 return 0;
}

      2.设计一个左面视图的方法,使我们可以在文档类中调用这个方法为左面视图添加Items,这其中要完成的任务还有在内存中做好每个图像文件的Bitmap(位图资源)。

代码如下:

void CWorkspaceBar::InitialListCtrl(int imageCount,CString *pImageNameList)
//根据读入的文档数据初始化列表控件

//传入参数imageCount是图像文件的总数,pImageNameList是各个图像文件按顺序的名字列表
{
 //保存文档的数据
 m_imageCount=imageCount;
 m_pImageNameList=pImageNameList;

 //应用CXImage在内存中动态生产指定大小的位图
 CxImage image;        //声明CXImage对象
 for (int i=0;i  {
  //应用CXImage载入图像,本程序是相对路径
  image.Load(pImageNameList[i],CXIMAGE_FORMAT_BMP);
 
  //应用CXImage将图像变成我们指定的大小即96*96的,前面声明CImageList时就是96*96的
  image.Resample(96,96,2);
  //应用CXImage在内存中生产位图
  CDC *pDC = GetDC();
  HBITMAP hBit=image.MakeBitmap(pDC->GetSafeHdc());
  CBitmap bmp;
  bmp.Attach(hBit);
  //将位图加到图像列表中
  m_MyImageList.Add(&bmp,RGB(255, 255, 255));
  bmp.Detach();
 }
 //将图像列表与列表控件关联起来
 m_ListCtl.SetImageList(&m_MyImageList, LVSIL_NORMAL);
 //设置列表控件各项
 LVITEM item;
  item.mask=LVIF_TEXT|LVIF_IMAGE;
 item.iItem=0;   // 第1项
  item.iSubItem=0;        // 主项
  item.pszText="";
  item.iImage=0;  // 设置关联图像列表中指定图像的索引值
  m_ListCtl.InsertItem(&item);  // 添加第1项
 m_ListCtl.SetItemText(0,0,pImageNameList[0]);
 
 for (i=1;i  {
  item.iItem=i;           // 准备添加项
   item.iImage=i;
   m_ListCtl.InsertItem(&item);
  m_ListCtl.SetItemText(i,0,pImageNameList[i]);
 }
 DWORD  dwOldStyle,dwNewStyle;
 dwNewStyle = LVS_ICON;
 HWND  hWndLt=m_ListCtl.GetSafeHwnd();  // 获得列表视图控件的窗口句柄
 dwOldStyle=GetWindowLong(hWndLt, GWL_STYLE);  // 获得列表视图控件的窗口风格
 if((dwOldStyle & LVS_TYPEMASK)!=LVS_ICON)  // 判断当前的显示方式是不是所指定的方式
 {
  dwOldStyle &=~LVS_TYPEMASK;   // 从旧的窗口风格中屏蔽不必要的信息
  dwNewStyle |=dwOldStyle;   // 保持窗口其它风格不变,仅改变显示方式
  SetWindowLong(hWndLt, GWL_STYLE, dwNewStyle);  // 改变列表控件窗口风格
 }
}

剩下的工作就是写各个消息的处理方法了,包括点击相应缩略图在对应的视图里显示各个图像等等。

       总结:本程序是基于CXImage影像处理库做的。CXImage是一个很好的图像处理库,在网上可以很容易下到,而且是开源的。笔者认为CXImage要优于GDI、GDI+。本程序在VC++6.0中调试通过,运行良好。

你可能感兴趣的:(界面)