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

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

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

程序所达到的效果:

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

 

[cpp] view plain copy

 

  1. int CWorkspaceBar::OnCreate(LPCREATESTRUCT lpCreateStruct)   
  2. {  
  3.  if (CBCGPDockingControlBar::OnCreate(lpCreateStruct) == -1)  
  4.   return -1;  
  5.    
  6.  CRect rectDummy;  
  7.  rectDummy.SetRectEmpty ();  
  8.   
  9.  // Create tree windows.  
  10.  //动态生产列表控件和图像列表  
  11.  m_ListCtl.Create(LVS_ICON|WS_CHILD | WS_VISIBLE|LVS_TYPEMASK,  
  12.                                  CRect(0,0,150,500),this,100);  
  13.  m_MyImageList.Create(64,64,ILC_COLOR24, 0, 1);  
  14.    
  15.  return 0;  
  16. }  

 

 

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

 

代码如下:

[cpp] view plain copy

 

  1. void CWorkspaceBar::InitialListCtrl(int imageCount,CString *pImageNameList)  
  2. //根据读入的文档数据初始化列表控件  
  3.   
  4. //传入参数imageCount是图像文件的总数,pImageNameList是各个图像文件按顺序的名字列表  
  5. {  
  6.  //保存文档的数据  
  7.  m_imageCount=imageCount;  
  8.  m_pImageNameList=pImageNameList;  
  9.   
  10.  //应用CXImage在内存中动态生产指定大小的位图  
  11.  CxImage image;        //声明CXImage对象  
  12.  for (int i=0;i<imageCount;i++)  
  13.  {  
  14.   //应用CXImage载入图像,本程序是相对路径  
  15.   image.Load(pImageNameList[i],CXIMAGE_FORMAT_BMP);  
  16.    
  17.   //应用CXImage将图像变成我们指定的大小即96*96的,前面声明CImageList时就是96*96的  
  18.   image.Resample(96,96,2);  
  19.   //应用CXImage在内存中生产位图  
  20.   CDC *pDC = GetDC();  
  21.   HBITMAP hBit=image.MakeBitmap(pDC->GetSafeHdc());  
  22.   CBitmap bmp;  
  23.   bmp.Attach(hBit);  
  24.   //将位图加到图像列表中  
  25.   m_MyImageList.Add(&bmp,RGB(255, 255, 255));  
  26.   bmp.Detach();  
  27.  }  
  28.  //将图像列表与列表控件关联起来  
  29.  m_ListCtl.SetImageList(&m_MyImageList, LVSIL_NORMAL);  
  30.  //设置列表控件各项  
  31.  LVITEM item;  
  32.   item.mask=LVIF_TEXT|LVIF_IMAGE;  
  33.  item.iItem=0;   // 第1项  
  34.   item.iSubItem=0;        // 主项  
  35.   item.pszText="";  
  36.   item.iImage=0;  // 设置关联图像列表中指定图像的索引值  
  37.   m_ListCtl.InsertItem(&item);  // 添加第1项  
  38.  m_ListCtl.SetItemText(0,0,pImageNameList[0]);  
  39.    
  40.  for (i=1;i<imageCount;i++)  
  41.  {  
  42.   item.iItem=i;           // 准备添加项  
  43.    item.iImage=i;  
  44.    m_ListCtl.InsertItem(&item);  
  45.   m_ListCtl.SetItemText(i,0,pImageNameList[i]);  
  46.  }  
  47.  DWORD  dwOldStyle,dwNewStyle;   
  48.  dwNewStyle = LVS_ICON;  
  49.  HWND  hWndLt=m_ListCtl.GetSafeHwnd();  // 获得列表视图控件的窗口句柄  
  50.  dwOldStyle=GetWindowLong(hWndLt, GWL_STYLE);  // 获得列表视图控件的窗口风格  
  51.  if((dwOldStyle & LVS_TYPEMASK)!=LVS_ICON)  // 判断当前的显示方式是不是所指定的方式  
  52.  {  
  53.   dwOldStyle &=~LVS_TYPEMASK;   // 从旧的窗口风格中屏蔽不必要的信息  
  54.   dwNewStyle |=dwOldStyle;   // 保持窗口其它风格不变,仅改变显示方式  
  55.   SetWindowLong(hWndLt, GWL_STYLE, dwNewStyle);  // 改变列表控件窗口风格  
  56.  }  
  57. }  

 

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

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

时间: 2024-09-13 18:22:40

VC++基于CXImage库实现缩略图的相关文章

PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)_php实例

还是老规矩,直接上代码 <?php /** * 缩略图生成类,使用示例: */ $newimage=new ImageResize(); $newimage->resize("tu.jpg","tu_lit.jpg",1000,1000); echo $newimage->GetLastError(); class ImageResize{ private $localimage;//原图路径 private $remoteimage;//缩略图保

python基于Tkinter库实现简单文本编辑器实例

  这篇文章主要介绍了python基于Tkinter库实现简单文本编辑器,实例分析了Python使用Tkinter库实现简单桌面应用程序的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了python基于Tkinter库实现简单文本编辑器的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 3

指针-vc基于对话框的串口助手绘制波形图闪烁问题

问题描述 vc基于对话框的串口助手绘制波形图闪烁问题 在ontimer函数中进行了这样的双缓冲处理为什么settimer(1,50,NULL),还闪烁特别厉害呢,需要怎么修改 //双缓冲技术 CWnd *pWnd; CRect rc; CDC *m_pDC; CDC memDC; pWnd=GetDlgItem(IDC_STATIC_GWAVE); //把控件地址赋给窗口类指针 //定义一个控件尺寸结构体 pWnd->GetClientRect(&rc); //获取空间指针赋值给rc CRe

vc 基于对话框多线程编程实例——线程之间的通信

 vc基于对话框多线程编程实例--线程之间的通信 实例:  

使用innobackupex基于从库搭建mysql主从架构

        MySQL的主从搭建大家有很多种方式,传统的mysqldump方式是很多人的选择之一.但对于较大的数据库则该方式并非理想的选择.使用Xtrabackup可以快速轻松的构建或修复mysql主从架构.本文描述了基于现有的从库来快速搭建主从,即作为原主库的一个新从库.该方式的好处是对主库无需备份期间导致的相关性能压力.搭建过程中使用了快速流备份方式来加速主从构建以及描述了加速流式备份的几个参数,供大家参考.     有关流式备份可以参考:Xtrabackup 流备份与恢复 1.备份

PHP基于GD库的图像处理方法小结_php技巧

本文实例讲述了PHP基于GD库的图像处理方法.分享给大家供大家参考,具体如下: gd图像处理技术 extension=php_gd2.dll 创建画布 画布,一种资源型数据,可操作的图像资源 创建画布(新建) imageCreate(width,height) //创建基于调色板的画布 imageCreateTrueColor(width,height) //创建真彩色的画布 基于图片创建画布(打开) imageCreateFromJPEG( url) imageCreateFromPNG(ur

php利用GD库生成缩略图示例_Mysql

php利用GD库生成缩略图. 复制代码 代码如下: <form method="post" action="suo_do.php" enctype="multipart/form-data"> <input type="file" name="pic" /> <input type="submit" value="上传1" /> &

JS基于myFocus库实现各种功能的tab选项卡切换效果_javascript技巧

本文实例讲述了JS基于myFocus库实现各种功能的tab选项卡切换效果.分享给大家供大家参考.具体如下: 这里介绍使用myFocus-tab实现各种功能的选项卡切换,有的是带有动画效果的,各款基于myFocus库制作的焦点图风格皮肤,可自行按需选择,myFocus焦点图库及皮肤可自由使用,保留作者相关信息即可,谢谢支持!^^ 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-myfocus-plug-tab-cha-nav-codes/ 具

musl 0.7.11发布 基于标准库Linux系统

musl是一个基于标准库Linux系统的实现.它是轻量级的,快速,简单,自由,并努力在标准上保持一致性和安全意识.它包括一个建设项目对musl在系统的标准库(如glibc)的地方,从而有可能立即评估库,建立与它小巧的静态链接二进制文件. musl 0.7.11共享库和动态加载(dlopen/dlsym)现在支持通过一个集成的近乎零开销的动态链接器.其他新功能包括POSIX消息队列,posix_spawn的search.h接口,random()PRNG,环境和浮点操作.中度严重的几个字符串和宽字符