应用CImage类用文件和流的方式显示图片和放大缩小图片

2024-03-23 16:18

本文主要是介绍应用CImage类用文件和流的方式显示图片和放大缩小图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.是MFC工程
2.创建默认工程:单文档工程
3.工程名:JPEGTest
4.1在CJPEGTestView类中添加
HANDLE    m_hFile;
CImage m_Image;
void LoadMemImage( void *  pMemData,  long  len);
afx_msg void OnFileOpen();
4.2在stdafx.h中添加#include <atlimage.h>
4.3在CJPEGTestView.cpp中添加
BEGIN_MESSAGE_MAP(CJPEGTestView, CView)
ON_COMMAND(ID_FILE_OPEN,            &CJPEGTestView::OnFileOpen)//这个是添加的
END_MESSAGE_MAP()
4.4
void CJPEGTestView::OnFileOpen()
{
CString strFilter;
CSimpleArray<GUID> aguidFileTypes;
HRESULT hResult;

// 获取CImage支持的图像文件的过滤字符串
hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,
_T( "All Image Files") );
if ( FAILED(hResult) )
{
MessageBox(_T("GetExporterFilter调用失败!"));
return;
}
CFileDialog dlg( TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter );
if ( IDOK != dlg.DoModal() )
return;

m_Image.Destroy();

{
//在此处是用流的方式显示JPEG
m_hFile = ::CreateFile(dlg.GetFileName(),GENERIC_READ,0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_READONLY,NULL); // 用这个函数比OpenFile好
if ( m_hFile == INVALID_HANDLE_VALUE)
{
MessageBox(_T("打开文件失败"));
CloseHandle( m_hFile ); // 一定注意在函数退出之前对句柄进行释放。
return;
}
DWORD filesize=GetFileSize( m_hFile,NULL );

char* buffer=new char[filesize+1]; // 最后一位为 '/0',C-Style 字符串的结束符。

DWORD readsize;
ReadFile( m_hFile,buffer,filesize,&readsize,NULL);

buffer[filesize]=0;

LoadMemImage(buffer,readsize);

delete[] buffer; // 注意是delete[] 而不是 delete
CloseHandle(m_hFile); // 关闭句柄。
}

// 设置主窗口标题栏内容
CString str;
str.LoadString(AFX_IDS_APP_TITLE);

AfxGetMainWnd()->SetWindowText(str + _T("_") + dlg.GetFileName());

Invalidate(); // 强制调用OnDraw
}
void CJPEGTestView::LoadMemImage( void *  pMemData,  long  len)
{
HGLOBAL hGlobal  GlobalAlloc(GMEM_MOVEABLE, len);

void *  pData  GlobalLock(hGlobal);

memcpy(pData, pMemData, len);

GlobalUnlock(hGlobal);

IStream *  pStream  NULL;
if  (CreateStreamOnHGlobal(hGlobal, TRUE,  & pStream)  ==  S_OK)
{
if ( FAILED( m_Image.Load(pStream)) )
{
MessageBox(_T("调用图像文件失败!"));
return;
}
pStream -> Release();
}
GlobalFree(hGlobal);
}
void CJPEGTestView::OnDraw(CDC* pDC)
{
CJPEGTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!m_Image.IsNull())
{
m_Image.Draw(pDC->m_hDC,0,0);
}
}
5.还可以添加放大缩小功能
在:CJPEGTestDoc类中添加:
public:
inline float GetZoomFactor() { return m_ZoomFactor; }

protected:
float m_ZoomFactor;//在构造函数中初始化1.00
BEGIN_MESSAGE_MAP(CJPEGTestDoc, CDocument)
ON_COMMAND(AFX_ID_PREVIEW_ZOOMOUT, OnViewZoomout)
ON_COMMAND(AFX_ID_PREVIEW_ZOOMIN, OnViewZoomin)
END_MESSAGE_MAP()
void CJPEGTestDoc::OnViewZoomout()
{
if (m_ZoomFactor<=0.0625) return;

if        (m_ZoomFactor == 2.00f) m_ZoomFactor = 1.50f;
else if (m_ZoomFactor == 1.50f) m_ZoomFactor = 1.00f;
else if (m_ZoomFactor == 1.00f)    m_ZoomFactor = 0.75f;
else if (m_ZoomFactor == 0.75f)    m_ZoomFactor = 0.50f;
else                            m_ZoomFactor/=2;

CStatusBar& statusBar = ((CMainFrame *)(AfxGetApp()->m_pMainWnd))->GetStatusBar();
CString s;
s.Format(_T("%4.1f %%"),m_ZoomFactor*100);
statusBar.SetPaneText(2, s);

UpdateAllViews(NULL,WM_USER_NEWIMAGE);
}
void CJPEGTestDoc::OnViewZoomin()
{
if (m_ZoomFactor>=16) return;

if        (m_ZoomFactor == 0.50f) m_ZoomFactor = 0.75f;
else if (m_ZoomFactor == 0.75f) m_ZoomFactor = 1.00f;
else if (m_ZoomFactor == 1.00f)    m_ZoomFactor = 1.50f;
else if (m_ZoomFactor == 1.50f)    m_ZoomFactor = 2.00f;
else                            m_ZoomFactor*=2;

CStatusBar& statusBar = ((CMainFrame *)(AfxGetApp()->m_pMainWnd))->GetStatusBar();
CString s;
s.Format(_T("%4.0f %%"),m_ZoomFactor*100);
statusBar.SetPaneText(2, s);

UpdateAllViews(NULL,WM_USER_NEWIMAGE);
}
6.显示的时候,做相应的更改
void CJPEGTestView::OnDraw(CDC* pDC)
{
CJPEGTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!m_Image.IsNull())
{
float zoom=pDoc->GetZoomFactor();
if (zoom==1)
m_Image.Draw(pDC->m_hDC,0,0);
else
{
pDC->SetStretchBltMode( HALFTONE ); //防止缩小图片失真
m_Image.Draw(pDC->GetSafeHdc(),CRect(0,0,(int)(m_Image.GetWidth()*zoom),(int)(m_Image.GetHeight()*zoom)));
  
}
}
差不多了。就这些,也是从网上看了相关的资料后,自己动手实验一下。

 

转载自:http://blog.sina.com.cn/s/blog_5f432e6a0100u993.html

这篇关于应用CImage类用文件和流的方式显示图片和放大缩小图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/838876

相关文章

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

ShardingSphere之读写分离方式

《ShardingSphere之读写分离方式》:本文主要介绍ShardingSphere之读写分离方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录ShardingSphere-读写分离读写分离mysql主从集群创建 user 表主节点执行见表语句项目代码读写分