[-blogs-]图像处理界面--缩略图的显示

编写一个图像处理类的程序,实现缩略图是非常自然的想发。基于mfc+opencv框架,实现以下代码

style child border none

一、填写界面 主要实现图片的添加、删除、显示

左边是listctrl控件(alignment为top),右边是textbox控件(client edge 为true)。textbox控件主要用来占个位置,具体显示的时候要进行重载处理。

二、实现缩略图

1)最方便使用的缩略图函数是Gdiplus下的 GetThumbnailImage函数

Bitmap* pThumbnail = static_cast<Bitmap*>(img.GetThumbnailImage(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, NULL, NULL));

能够将大图转换为小图。为了使用Gdiplus,首先需要引入和初始化

#include <gdiplus.h>

using namespace Gdiplus;

#pragma comment(lib, "gdiplus.lib")

ULONG_PTR GdiplusToken;

GdiplusStartupInput gdiplusStartupInput;

在initdialog中

GdiplusStartup(&GdiplusToken, &gdiplusStartupInput, NULL);

2)添加图片函数,主要是将文件目录名push到m_VectorImageNames结构中

void CGOthumbnailDlg::OnBnClickedButtonAddimg()

{

CString szFilters= _T("*(*.*)|*.*|jpg(*.jpg)|*.jpg|bmp(*.bmp)|*.bmp||");

CFileDialog dlgFile(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilters,NULL,0,TRUE);

CString FilePathName ;

if(dlgFile.DoModal()==IDOK){

FilePathName = dlgFile.GetPathName();

}

m_VectorImageNames.push_back(FilePathName);

DrawThumbnails();

}

3)为了图片保存在imagelist中,并且使用listctrl控件进行显示,并且在初始化的时候进行定义

m_ImageListThumb.Create(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, ILC_COLOR24, 0, 1);

m_ListThumbnail.SetImageList(&m_ImageListThumb, LVSIL_NORMAL);

m_nSelectedItem = 0;

具体绘图函数

void CGOthumbnailDlg::DrawThumbnails(void)

{

CBitmap*    pImage = NULL;

HBITMAP        hBmp = NULL;

POINT        pt;

CString        strPath;

// no images

if (m_VectorImageNames.empty())

return;

//不自动刷新

m_ListThumbnail.SetRedraw(FALSE);

// reset our image list

for (int i = 0; i<m_ImageListThumb.GetImageCount(); i++)

m_ImageListThumb.Remove(i);

// remove all items from list view

if (m_ListThumbnail.GetItemCount() != 0)

m_ListThumbnail.DeleteAllItems();

// set the size of the image list

m_ImageListThumb.SetImageCount(m_VectorImageNames.size());

// draw the thumbnails

for (int i = 0;i<m_VectorImageNames.size();i++)

{

USES_CONVERSION;

Bitmap img( m_VectorImageNames[i].AllocSysString());

//使用GDI直接获得thumbnail

Bitmap* pThumbnail = static_cast<Bitmap*>(img.GetThumbnailImage(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, NULL, NULL));

// attach the thumbnail bitmap handle to an CBitmap object

pThumbnail->GetHBITMAP(NULL, &hBmp);

pImage = new CBitmap();

pImage->Attach(hBmp);

m_ImageListThumb.Replace(i, pImage, NULL);

m_ListThumbnail.InsertItem(i, m_VectorImageNames[i], i);

delete pImage;

delete pThumbnail;

}

//显示thumbnail

m_ListThumbnail.SetRedraw();

}

4)点击图片能够显示大图

void CGOthumbnailDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)

{

// retrieve message info.

LPNMITEMACTIVATE pItemAct = (LPNMITEMACTIVATE)pNMHDR;

// determine which item receives the click

LVHITTESTINFO  hitTest;

ZeroMemory(&hitTest, sizeof(LVHITTESTINFO));

hitTest.pt = pItemAct->ptAction;

m_ListThumbnail.SendMessage(LVM_SUBITEMHITTEST, 0, (LPARAM)&hitTest);

// draw the selected image

if ( hitTest.iItem >= 0)

{

m_nSelectedItem = hitTest.iItem;

DrawSelectedImage();

}

// select the item clicked

*pResult = 0;

}

void CGOthumbnailDlg::DrawSelectedImage(void)

{

CString        strPath;

Rect        DesRect;

RECT        clRect;

USES_CONVERSION;

Image img(m_VectorImageNames[m_nSelectedItem].AllocSysString() );

// get destination rectangle

m_imagerect.GetClientRect(&clRect);

DesRect.X = clRect.left;

DesRect.Y = clRect.top;

DesRect.Width = clRect.right - clRect.left;

DesRect.Height = clRect.bottom - clRect.top;

// draw the image

Graphics gc( m_imagerect.GetDC()->GetSafeHdc() );

gc.DrawImage(&img, DesRect);

}

5)重载textbox的基类,改为imagearea类,主要是重载paint函数

void CImageArea::OnPaint()

{

CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

CGOthumbnailDlg*  pWnd = static_cast<CGOthumbnailDlg*>(GetParent());

if(pWnd->m_ListThumbnail.GetItemCount() != 0)

pWnd->DrawSelectedImage();

// Do not call CStatic::OnPaint() for painting messages

}

三、实现结果和小结

这个程序看似只是解决一个简单的问题,但是涉及到的东西很多。能够比较好的解决关键是找到了比较好的参考代码。同时也是因为我在很久之前就发现了这个问题,并且积极地去寻找解决方法。这两点应该都是最后得到比较好的结果必不可少的。

下一步就是需要把这样的程序进行整理整合,更好方便复用。

来自为知笔记(Wiz)

时间: 2024-10-01 05:14:14

[-blogs-]图像处理界面--缩略图的显示的相关文章

【excel技巧读书笔记014】工作界面的底部显示计数、求和

设置状态栏,在Excel的工作界面底部,显示各种状态信息,单元格模式.功能键开关等.选中数据会显示求和.计数.平均值.数值计数等.

android 自动拒接后再取消自动拒接,该联系人来电界面无图标显示,且点击挂断无反应

1.    设置一个联系人为自动拒接 2.    该联系人来电 3.    取消该联系人的自动拒接 4.    该联系人来电 Error: 来电界面无头像显示,直接显示黑屏,且点击拒接按钮出现通话过程的界面,而实际后台已经挂断 修改CallNotifier.java文件中onDisconnect()方法中以下位置添加如下代码: if (!mIsShouldSendtoVoicemail && ok2Ring) { Toast.makeText(PhoneApp.getInstance().

android 自己主动拒接后再取消自己主动拒接,该联系人来电界面无图标显示,且点击挂断无反应

1.    设置一个联系人为自己主动拒接 2.    该联系人来电 3.    取消该联系人的自己主动拒接 4.    该联系人来电 Error: 来电界面无头像显示,直接显示黑屏,且点击拒接button出现通话过程的界面,而实际后台已经挂断 改动CallNotifier.java文件里onDisconnect()方法中下面位置加入例如以下代码: if (!mIsShouldSendtoVoicemail && ok2Ring) { Toast.makeText(PhoneApp.getI

Dede 列表页 缩略图 有显示无则不显示

[field:array runphp='yes']@me = (strpos(@me['litpic'],'defaultpic') ? "" : "<div class='atc'><a href='{@me['arcurl']}'><img src='{@me['litpic']}'/></a></div>"); [/field:array] Dede 列表页 缩略图 有显示无则不显示

WPF防止界面卡死并显示加载中效果

原文:WPF防止界面卡死并显示加载中效果 网上貌似没有完整的WPF正在加载的例子,所以自己写了一个,希望能帮到有需要的同学 前台: <Window x:Class="WpfApplication1.Loading" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml

dedecms有缩略图则显示缩略图,没有则显示随机缩略图

随着html5以及扁平化等新的设计概念的深入人心,缩略图功能则成了一般网页模版制作不可或缺的一个功能,dedecms默认的的缩略图调用标签[field:imglink/] 或者 [field:litpic/],在文章有缩略图的时候会调用缩略图,没有的时候就调用默认图片defaultpic.gif,但是会有各种意外的情况导致文章内没有配图,只是显示默认的图片的话,页面美观上就得不到保证,前面还有人分享过一篇通过js来实现随机缩略图的,具体使用起来的话,还是觉得有些鸡肋,今天的话给大家分享一个新的解

zabbix 监控界面状态一直显示为loading的解决方法

今天安装完Zabbix之后,第一次登录到监控界面,发现界面上的status状态都显示的是loading,等待了一会还是为改变,最后发现是nginx的问题. nginx在执行zabbix dashboard的 jsLoader.php时由于fastcgi缓存不够用,会生成临时文件放到/var/lib/nginx/tmp/fastcgi目录下面(目录是可配置的),由于目录没权限访问导致缓存文件无法生成,所以 jsLoader.php一直执行失败. 你可以调整fastcgi缓存目录的权限,或者加大ng

使用ThinkPHP实现生成缩略图及显示

首先了解父类Image.class.php(ThinkPHP/Library/Think/Image.class.php)中的一些函数 1:open() 打开被处理的图片 2:thumb() 生成缩略图 默认1等比缩放  (其中2,3,4,5,6代表的含义参见父类文件Image.class.php) 3:save() 缩略图到服务器 生成缩略图步骤分以下四步 * 1.实例化 * 2.打开图片open() * 3.生成缩略图thumb() 默认等比缩放 * 4.保存save() 控制器代码: //

在DLOG界面上动态显示显示BMP

1.通过点击界面浏览按钮选择BMP图像文件. 点击浏览按钮打开文件对话框选择BMP图像文件,得到文件所在的路径目录.关键代码如下: void ShowBMPDlg::OnButtonSelectiamge() { char szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files(*.*)|*.*||"; CFileDialog dlg( TRUE,"BMP",NULL,OFN_HIDEREADONLY | OFN_OVERWR