如何将MFC图片框中画的图形用CImage保存成多种格式

合集下载

c语言image用法 -回复

c语言image用法 -回复

c语言image用法-回复C语言image用法C语言是一种通用的编程语言,广泛应用于各种领域,包括图像处理。

在C语言中,image用法非常重要,它可以帮助我们处理图像数据,并对其进行各种操作。

本文将会详细介绍C语言中image的用法,从图像的读取到图像的处理,帮助读者了解如何使用image来处理图像数据。

首先,我们需要了解如何读取图像。

在C语言中,读取图像通常需要借助第三方库,最常用的是OpenCV库。

OpenCV是一种开源的计算机视觉库,提供了很多图像处理的功能,并支持多种图像格式。

要使用OpenCV 库,我们需要在程序中包含相应的头文件,并链接相应的库文件。

下面是一个简单的例子:c#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;int main() {Mat image;image = imread("image.jpg", IMREAD_COLOR);if (image.empty()) {cout << "Could not open or find the image" << endl;return -1;}namedWindow("Display window", WINDOW_AUTOSIZE);imshow("Display window", image);waitKey(0);return 0;}在这个例子中,我们首先包含了OpenCV的头文件,并使用`using namespace`语句简化了对OpenCV的使用。

然后我们定义了一个`Mat`类型的变量`image`,用来存储图像数据。

通过`imread`函数读取了一张名为"image.jpg"的图像,并将图像数据保存到`image`中。

CxImage功能强大的图形处理程序

CxImage功能强大的图形处理程序

CxImage功能强大的图形处理程序CxImage是免费开源的使用简单的图形处理程序,在这里演示了两个功能。

1 在对话框上加一按钮,其函数为将BMP位图转换成TIF和JPEG。

2 在对话框上加一按钮,抓屏为BMP位图,通过剪切板保存为JPG文件。

一CxImage简单使用说明大部分内容来自网上,做了适当地改进。

CxImage是免费开源的C++图形软件,支持BMP、GIF、ICO、TGA、JPEG、PCX、PNG、TIFF、MNG、RAS等文件格式,能够实现图像的导入、保存、显示,以及几何变换、格式转换,也可实现内存图像数据的类型转换。

CxImage的主要函数有:Constructors 构造函数,Initialization 初始化,File 文件编解码,Generic 图像基本变化,DSP 图像处理操作,Painting 绘图操作,Multiple Images 多帧图像操作,Transparency 透明层操作,Palette 调色板操作,Pixels 像素操作,Region Selection 区域选择操作,Alpha Channel Alpha通道操作,Layers 图像层操作,Attributes 图像属性操作,Miscellaneous 杂项等。

CxImage使用1. 下载CxImage的源代码可以到作者Davide Pizzolato 主页: http://www.xdp.it/,或者/bitmap/CXImage.asp,/KB/graphics/cximage.aspx下载CxImage的源代码和完整Demo。

可能需要先注册一个codeproject的免费账号。

2. 编译CxImage。

解压源码包,在解压后的目录下有一个CxImageLib.dsw工作空间文件,使用VC++ 6.0 打开该工作空间文件:①Project->Settings->C/C++,在Category下拉列表中选择Code Generation,将Use rum-time libary中选择MultiThread DLL.在Category下拉列表中选择Precompiled Headers中,选择第一项: Not using Precompiled headers.②Build->Batch Build->勾选你要编译的版本库。

MFC 在对话框显示图片的多种方法

MFC 在对话框显示图片的多种方法

MFC 在对话框显示图片的多种方法我们先从简单的开始吧.先分一个类:(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)(二) 动态载入图片(即只需要在程序中指定图片的路径即可载入)为方便说明,我们已经建好一个基于对话框的工程,名为Ttest.对话框类为CTestDlg(一) 非动态载入图片.方法1.先从最简单的开始,用picture 控件来实现. 步骤:先在资源里Import一张图片,ID为IDB_BITMAP2 然后在对话框上添加一个picture控件,右键点击打开属性,将type下拉框选择BITMAP,紧跟着下面就出现一个Image下拉框,拉开就会看到所有已经载入好的图片,选择你要的图片.运行程序即可看到.方法2.通过背景图同样如上,先载入一张图片,ID为IDB_BITMAP2 TestDlg.h中CBrush m_brBk;//在public中定义TestDlg.cpp中在初始化函数OnInitDialog()中加入:BOOL CTestDlg::OnInitDialog(){CDialog::OnInitDialog();CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2);m_brBk.CreatePatternBrush(&bmp);bmp.DeleteObject();...return TRUE; // return TRUE unless you set the focus to a control}在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下:HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr =CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if (pWnd == this){return m_brBk;}return hbr;}(二) 动态载入图片.方法3 图像控件(本例用KoDak 图像编辑控件)1. 首先应该保证系统中有这个控件。

CImage的一般使用方法和技巧

CImage的一般使用方法和技巧

我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标、位图、光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP、GIF、JPEG等)。

因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码。

现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了。

CImage类概述CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。

由于CImage在不同的Windows操作系统中其某些性能是不一样的,因此在使用时要特别注意。

例如,CImage::PlgBlt和CImage::MaskBlt只能在Windows NT 4.0 或更高版本中使用,但不能运行在Windows 95/98 应用程序中。

CImage::AlphaBlend和CImage::TransparentBlt也只能在Windows 2000/98或其更高版本中使用。

即使在Windows 2000运行程序还必须将stdafx.h文件中的WINVER和_WIN32_WINNT的预定义修改成0x0500才能正常使用。

CImage封装了DIB(设备无关位图)的功能,因而可以让我们能够处理每个位图像素。

它具有下列最酷特性:1、AlphaBlend支持像素级的颜色混合,从而实现透明和半透明的效果。

2、PlgBlt能使一个矩形区域的位图映射到一个平行四边形区域中,而且还可能使用位屏蔽操作。

3、TransparentBlt在目标区域中产生透明图像,SetTransparentColor用来设置某种颜色是透明色。

4、MaskBlt在目标区域中产生源位图与屏蔽位图合成的效果。

使用CImage的一般方法使用CImage的一般方法是这样的过程:(1) 打开应用程序的stdafx.h文件添加CImage类的包含文件:#include <atlimage.h>(2) 定义一个CImage类对象,然后调用CImage::Load方法装载一个外部图像文件。

解决mfc中画图重绘与保存

解决mfc中画图重绘与保存

解决mfc中画图重绘与保存MFC 图形的重绘与保存-- 总结2012-03-21 00:19 2092人阅读评论(1) 收藏举报图形mfc工作class一、利用集合类CPtrArray实现1.注意到,绘图时的关键参数有三个:原结点,末结点,绘制样式。

所以我们先添加一个类CGraph,如下:class CGraph{public:CGraph(void);CGraph(int nDrawType, CPoint& ptOrigin, CPoint& ptEnd);~CGraph(void);public:int m_nDrawType;CPoint m_ptOrigin;CPoint m_ptEnd;};2.其中CGraph(int nDrawType, CPoint& ptOrigin, CPoint& ptEnd)构造函数是我们主要用到的构造方式,我们提供这三个参数两构造具体的CGraph类对象。

其代码如下:CGraph::CGraph(int nDrawType, CPoint& ptOrigin, CPoint& ptEnd) {m_nDrawType = nDrawType;m_ptOrigin = ptOrigin;m_ptEnd = ptEnd;}3.在视图类CXXXView 中包含刚定义的CGraph类头文件:#include "Graph.h"并为视图类CXXXView 添加一个CPtrArray类的对象,作为成员变量。

4.上面都是完成重绘功能的准备工作,下面我们来具体完成重绘操作:在OnLButtonDown这个响应函数中,根据具体的m_nDrawType,m_ptOrigin,m_ptEnd 参数来构造一个CGrahp对象,再利用CPtrArray 类的Add成员函数将这个对象添加到CPtrArray 中。

有一点要注意,CGraph应选择new 来构造,只是为了防止局部对象在退出其作用域后被销毁所引起的错误。

VS2010利用MFC的Picture控件显示和处理图像

VS2010利用MFC的Picture控件显示和处理图像

利用 MFC 的 Picture 控件显示和处理图像在《OpenCV 教程-基础篇》的 2.8 节中,所创建的 MFC 图像显示是直接放在对话框面板的左上 角的,感觉不大美观;《MFC 中快速应用 OpenCV》 则是介绍用 SDI(单文档界面)来显示图 像,《A step-by-step guide to the use of Microsoft Visual C++ and the Intel OpenCV library》 使用 VS2005 来进行图像和视频的读取和处理,但是其图像和视频的显示界面不是在对话框里面 的,而是新建一个窗口来做。

所以下面我们就来看看怎么在对话框里使用 Picture 控件来显示和 处理图像。

[编辑]创建 MFC首先创建一个 MFC 对话框应用程序(Dialog-based Application)如下:在 VS2005 和 2008 里,我们可以用一个 Solution 来组合几个 Project (每个 Project 基本上 只包含一个 Program),当我们要构建一个多 Program 的应用时(例如一个客户端程序加一个 服务器应用程序),利用 Solution 可以将这些 Projects 组合起来、并且共享文件和函数库。

通常需要为 Solution 创建一个主路径,其中包含了所有 Projects 的路径。

不过在这篇文章里, 我们只构建一个简单的 Project,所以在创建 MFC 的 New Project 对话框里,不用勾选“Create directory for solution”这个选项。

点击 OK -- Next 进入下一步,在这里我们创建一个 Dialog-based Application,大部分选项按默 认设置就行,不过最下面的“Use Unicode libraries”最好去掉。

如果勾选了这个选项,程序代码 就会使用 16bit 的 Unicode 字符集来编码,但是很多函数虽然使用 char* (ASCII stings) 类型字 符,而将字符串从 Unicode 转换到 ASCII 是非常麻烦的。

cimage 用法

cimage 用法

cimage 用法CImage是一个C++库,用于在Windows平台上处理图像的加载、保存和编辑。

使用CImage时,首先需要包含CImage头文件:```#include <atlimage.h>```然后,可以创建一个CImage对象并加载图像:```CImage image;image.Load(_T("image.jpg"));```可以将图像保存为不同的格式:```image.Save(_T("image.png"), Gdiplus::ImageFormatPNG); image.Save(_T("image.bmp"), Gdiplus::ImageFormatBMP);```对图像进行一些简单的操作,例如调整大小、裁剪和旋转等:```image.Resizе(800, 600);image.Crop(100, 100, 600, 400);```此外,CImage还提供了其他功能,例如绘制图像、获取图像信息和处理透明通道等。

需要注意的是,CImage依赖于GDI Plus库,因此在使用CImage之前,需要先初始化GDI Plus。

```Gdiplus::GdiplusStartupInput gdiplusStartupInput;ULONG_PTR token;Gdiplus::GdiplusStartup(&token, &gdiplusStartupInput, NULL);```最后,需要在程序退出之前清理CImage和GDI Plus相关资源。

```Gdiplus::GdiplusShutdown(token);```。

MFC对话框打开一幅图片并在picture显示和图片保存

MFC对话框打开一幅图片并在picture显示和图片保存

学了MFC一段时间后,试着要用对话框打开一幅bmp图像并保存,结果发现网上这些资料太少了,而且有的也讲不清,讲不全,所以自己磕磕碰碰捣鼓了好久,期间也谢谢各位大神的指导,现在我终于完成,特意写出来与大家分享,各位菜鸟共勉。

一、首先要先了解bmp位图结构可以去看看,内容不多但是够看,也容易懂二、了解位图的显示函数SetStretchBltMode()StretchDIBits()具体函数介绍自己百度一下,我就不多说了三、开始做啦1、新建一个MFC对话框文档默认其他设置,点击完成后会出现这个界面&在按钮上单击鼠标右键,在弹出的列表中选择属性把标题改为读取图片再添加一个按钮,把ID改为IDC_SAVE,标题改为保存图片在控件中选择图像,然后在对话框画一个大小适宜的矩形框,在选中对话框点击右键,选择属性,把ID改为IDC_PICTURE回到对话框界面,双击读取图片按钮,这时会弹出一个对话框,点确定然后就会跳到关联函数这边了先把CDialog::OnOK();注释起来,这个是点击按钮后对话框就会关闭的函数【然后在MP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|",this);CFile bmpFile;pp文件头处添加BITMAPINFO* pBmpInfo;MP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|");if (!() == IDC_SAVE) return;strFileName = ();if (strFileName, CFile::modeCreate | CFile::modeReadWrite) == 0) return ;Widthbytes = (iBmpWidth*3+3)/4*4;//位图对齐,确保为4的倍数/* BITMAPFILEHEADER结构填写 */`= 0x4d42;=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);= + Widthbytes *iBmpHeight;= 0;= 0;/* BITMAPINFOHEADER结构填写 */= sizeof(BITMAPINFOHEADER);= iBmpWidth;=iBmpHeight;= 1;\= 24;//24位= BI_RGB;=0;= 0;= 0;= 0;= 0;(&bmpf,sizeof(bmpf));//写文件头;(&bmpi,sizeof(bmpi));//写信息头;|(pBmpData,Widthbytes*iBmpHeight);//写图像数据信息;();OK全部完成了,编译运行一下,点击打开图片按钮就能显示图片了呵呵,写得不够专业,还望大家不吝赐教。

CxImage图像处理类库说明

CxImage图像处理类库说明

CxImage图像处理类库CxImage是一个可以用于MFC 的C++图像处理类库类,它可以打开,保存,显示,转换各种常见格式的图像文件,比如BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的文件。

可以实现BMP<->JPG,PNG <>TIFF 格式等等的互相转换。

CxImage不仅可以实现图像文件的类型转换,还可以实现在内存图像数据的类型转换,并且使用很方便。

除了文件格式的相互转换,它还提供了很多很多图像后处理的功能,比如图像模糊,锐化等等,功能非常强大和实用。

CxImage中的x,大约代表了丰富的图像格式支持和丰富的图像处理功能,可以说CxImage是图像处理的十全大补汤。

用CxImage实现的图像处理程序开发环境:VC6, C++, Windows, MFC, Visual Studio, VS6, Dev简介和许可CxImage是一个可以简便而快速地打开,保存,显示和转换图像文件的C++类库。

CxImage类库是免费的。

对于TIFF,JPEG,PNG和ZLIB,"如果你在你的产品中使用了这些源代码,虽然致谢不是必须的,但是却会得到众人的欣赏。

"CxImage是开源的并在zlib许可下发布。

简单地说,你可以随意地使用这些代码,只要你不说它是你自己的就行了。

文件格式和链接的库CxImage支持如下这些库的最新版本:Zlib (1.2.3), Jasper ( 1.900.1), LibMNG (1.0.10), LibPNG (1.2.24). LibTIFF 3.8.2j2k库(现在被称为openjpeg)和相关的类CxImageJ2K已经从项目中删除。

JPEG2000格式的文件由Jasper和CximageJAS来支持。

Cximage 6.00提供了一个新的类CximageRAW和新的库LibDCR,用于读取来自数码相机的RAW图像。

图像打开,另存为,转为灰度图像(利用cimage方法实现)

图像打开,另存为,转为灰度图像(利用cimage方法实现)

CImage类的介绍与使用程序代码下载处:/source/2098910下载处:/wangleitongxing/blog/item/9063b03e5e20f3c97c1e71c8.htmlVisual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标、位图、光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP、GIF、JPEG等)。

因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码。

现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了。

CImage类概述CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。

由于CImage在不同的Windows 操作系统中其某些性能是不一样的,因此在使用时要特别注意。

例如,CImage::PlgBlt和CImage::MaskBlt只能在Windows NT 4.0 或更高版本中使用,但不能运行在Windows 95/98 应用程序中。

CImage::AlphaBlend和CImage::TransparentBlt也只能在Windows 2000/98或其更高版本中使用。

即使在Windows 2000运行程序还必须将stdafx.h文件中的WINVER和_WIN32_WINNT的预定义修改成0x0500才能正常使用。

CImage封装了DIB(设备无关位图)的功能,因而可以让我们能够处理每个位图像素。

它具有下列最酷特性:1、AlphaBlend支持像素级的颜色混合,从而实现透明和半透明的效果。

2、PlgBlt能使一个矩形区域的位图映射到一个平行四边形区域中,而且还可能使用位屏蔽操作。

3、TransparentBlt在目标区域中产生透明图像,SetTransparentColor用来设置某种颜色是透明色。

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

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

应⽤CImage类⽤⽂件和流的⽅式显⽰图⽚和放⼤缩⼩图⽚1.是MFC⼯程2.创建默认⼯程:单⽂档⼯程3.⼯程名:JPEGTest4.1在CJPEGTestView类中添加HANDLE m_hFile;CImage m_Image;void LoadMemImage( void * pMemData, long len);afx_msg void OnFileOpen();4.2在stdafx.h中添加#include4.3在CJPEGTestView.cpp中添加BEGIN_MESSAGE_MAP(CJPEGTestView, CView)ON_COMMAND(ID_FILE_OPEN, &CJPEGTestView::OnFileOpen)//这个是添加的END_MESSAGE_MAP()4.4void CJPEGTestView::OnFileOpen(){CString strFilter;CSimpleArray 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();{//在此处是⽤流的⽅式显⽰JPEGm_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 ); // ⼀定注意在函数退出之前对句柄进⾏释放。

C++中图像处理的类之一CxImage

C++中图像处理的类之一CxImage

C++中图像处理的类之⼀CxImageCxImage 是⼀个C++类,可以加载、保存、显⽰,转换BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式图像。

Cximage以位图为基础,并附加⼀些信息保存信息。

Code:class CxImage{...protected:void* pDib; //contains the header, the palette, the pixelsBITMAPINFOHEADER head; //standard headerCXIMAGEINFO info; //extended informationBYTE* pSelection; //selected regionBYTE* pAlpha; //alpha channelCxImage** pLayers; //generic layers}CxImage::head 是⼀个位图头,CxImage::pDib 是通常的位图。

CxImage::info 是⼀个存储在不同格式之间的许多共享信息。

Code:typedef struct tagCxImageInfo {DWORD dwEffWidth; //DWORD aligned scan line widthBYTE* pImage; //THE IMAGE BITSvoid* pGhost; //if this is a ghost, pGhost point to the bodyDWORD dwType; //original image formatchar szLastError[256]; //debugginglong nProgress; //monitorlong nEscape; //escapelong nBkgndIndex; //used for GIF, PNG, MNGRGBQUAD nBkgndColor; //used for RGB transparencyBYTE nQuality; //used for JPEGlong nFrame; //used for TIF, GIF, MNG : actual framelong nNumFrames; //used for TIF, GIF, MNG : total number of//framesDWORD dwFrameDelay; //used for GIF, MNGlong xDPI; //horizontal resolutionlong yDPI; //vertical resolutionRECT rSelectionBox; //bounding rectangleBYTE nAlphaMax; //max opacity (fade)bool bAlphaPaletteEnabled; //true if alpha values in the palette are// enabled.bool bEnabled; //enables the painting functionslong xOffset;long yOffset;DWORD dwEncodeOption; //for GIF, TIF : 0=def.1=unc,2=fax3,3=fax4,// 4=pack,5=jpgRGBQUAD last_c; //for GetNearestIndex optimizationBYTE last_c_index;bool last_c_isvalid;long nNumLayers;DWORD dwFlags;} CXIMAGEINFO;CxImage对象还是多层的集合。

VS2010中MFC利用CImage类显示图像

VS2010中MFC利用CImage类显示图像

VS2010中MFC利用CImage类显示图像我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标、位图、光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP、GIF、JPEG等)。

因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码。

现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了。

一、CImage类概述CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。

由于CImage在不同的Windows操作系统中其某些性能是不一样的,因此在使用时要特别注意。

例如,CImage::PlgBlt和CImage::MaskBlt只能在Windows NT 4.0 更高版本中使用,但不能运行在Windows 95/98 应用程序中。

CImage::AlphaBlend和CImage::TransparentBlt也只能在Windows 2000/98或其更高版本中使用。

即使在Windows 2000运行程序还必须将stdafx.h文件中的WINVER和_WIN32_WINNT的预定义修改成0x0500才能正常使用。

二、MFC中使用CImage类显示图像在图像控件(pictureControler)上(1)环境:Visual Studio 2010(2)如何使用?在使用的类头文件中,加入头文件“#include "atlimage.h"”(3)解决:1.类试图中,通过向导为Picture控件添加变量,如果不成功,则手动添加。

参考(VS2010为Picture Control手动添加变量)2.在对应的函数里添加如下代码:CImage image; //创建图片类image.Load(rphoto); //根据图片路径加载图片CRect rect;//定义矩形类int cx = image.GetWidth();//获取图片宽度int cy = image.GetHeight();//获取图片高度GetDlgItem(IDC_PICTURE)-&gt;GetWindowRect(&amp;rect);//将窗口矩形选中到picture控件上ScreenToClient(&amp;rect);//将客户区选中到Picture控件表示的矩形区域内GetDlgItem(IDC_PICTURE)-&gt;MoveWindow(rect.left, rect.top, cx, cy, TRUE);//将窗口移动到Picture控件表示的矩形区域CWnd *pWnd=GetDlgItem(IDC_PICTURE);//获得pictrue控件窗口的句柄pWnd-&gt;GetClientRect(&amp;rect);//获得pictrue控件所在的矩形区域CDC *pDC=pWnd-&gt;GetDC();//获得pictrue控件的DCimage.Draw(pDC-&gt;m_hDC, rect); //将图片画到Picture控件表示的矩形区域18. ReleaseDC(pDC);//释放picture控件的DC CImage image; //创建图片类image.Load(rphoto); //根据图片路径加载图片CRect rect;//定义矩形类int cx = image.GetWidth();//获取图片宽度int cy = image.GetHeight();//获取图片高度GetDlgItem(IDC_PICTURE)-&gt;GetWindowRect(&amp;rect); //将窗口矩形选中到picture控件上ScreenToClient(&amp;rect);//将客户区选中到Picture控件表示的矩形区域内GetDlgItem(IDC_PICTURE)-&gt;MoveWindow(rect.left, rect.top, cx, cy, TRUE);//将窗口移动到Picture控件表示的矩形区域CWnd *pWnd=GetDlgItem(IDC_PICTURE);//获得pictrue控件窗口的句柄pWnd-&gt;GetClientRect(&amp;rect);//获得pictrue控件所在的矩形区域CDC *pDC=pWnd-&gt;GetDC();//获得pictrue控件的DC image.Draw(pDC-&gt;m_hDC, rect); //将图片画到Picture控件表示的矩形区域ReleaseDC(pDC);//释放picture 控件的DC3.编译,运行。

CXImage使用说明

CXImage使用说明

一。

CxImage类库简介这只是翻译了CxImage开源项目主页上的部分简介及简单使用。

CxImage类库是一个优秀的图像操作类库。

它可以快捷地存取、显示、转换各种图像。

有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage, PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。

但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所束缚。

在这点上,CxImage类库是完全免费的。

另外,在使用上述类库时,你会遇到重重麻烦。

因为它们大部分是平台无关的,且用C语言写成,有的还夹杂着基本的C++ wrapper和成堆德编译选项的声明需要你去处理。

而CxImage类库在这方面做得很好。

还有让我最看好的,就是作者完全公开了源代码。

相对于那些封装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。

CxImage是一个可以用于MFC 的C++类,可以打开,保存,显示,转换各种格式的图像文件,比如BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的文件。

可以实现BMP<->JPG,PNG <>TIFF格式等等的转换。

既可以实现图像文件的类型转换,也可以实现在内存图像数据的类型转换,并且使用很方便。

它的作者是: Davide Pizzolato ,主页: http://www.xdp.it/首先,到/bitmap/CXImage.asp 下载它的源文件和Demo例子.注: 在Codeproject下载这个类,你得先注册一下,因为这个类可是含金量比较高的,下载量比较大的,当然你也会很高兴成为CodeProject的一名成员的,她不收你的费.授权:LicenseThe class CxImage is free; as for the TIFF, JPEG, PNG and ZLIB libraries : "If you use this source code in a product, acknowledgment is not required but would be appreciated."CxImage is open source and licensed under the zlib license . In a nutshell, this means that you can use the code however you wish, as long as you don't claim it as your own.由于很多人上codeproject的时候,老是上不去,所以,你也可以去这个类库的作者--Davide Pizzolato的主页去下载他的主页还有另外的源代码,有兴趣的也可以看看.二。

Cimage类处理图像像素(数据)的3种方式(转)

Cimage类处理图像像素(数据)的3种方式(转)

Cimage类处理图像像素(数据)的3种⽅式(转)这⾥只讨论对图像像素的处理,cimage类的具体⽤法查相关资料#include <atlimage.h> //VS2010以后不⽤加这个……………………CImage m_Image; //或CImage* m_Image; 下⾯例⼦程序我⽤的CImage m_Image; 只是⼀个⽤成员选择符,⼀个⽤指针操作,效率上可能有所差异下⾯是3种⽅法:⼀、⽤Cimage类的成员函数进⾏处理这⾥假设你已经加载了图像位图,并与CImage对象m_Image相关联。

相关成员函数主要有:GetPixel 返回像素颜⾊SetPixel 设置像素颜⾊如:m_Image.SetPixel( i-1, j-1, RGB(rr,gg,bb));SetPixelRGB 设置像素的红绿蓝如:m_Image.SetPixelRGB(x,y,avg,avg,avg);SetColorTable 设置调⾊板颜⾊分量(红、绿、蓝)值GetWidth 宽度(以像素为单位)GetHeight ⾼度1、程序⽰例1)⼀个双线性插值放⼤程序。

[cpp]1. if (m_Image.IsNull())2. return;3. // 创建对话框4. DlgInterpolation TranPara;5. //显⽰对话框,提⽰⽤户设定量6. if (TranPara.DoModal() != IDOK)7. return;8. int k=TranPara.m_inter;9. BeginWaitCursor();10. CImage m_Image1;11. if (! m_Image1.IsNull())12. {13. m_Image1.Destroy();14. }15. m_Image1.Create( m_Image.GetWidth()*k, m_Image.GetHeight()*k, 24,0);16. // 四个最临近象素的坐标17. int x1, x2;18. int y1, y2;19. // 四个最临近象素值20. unsigned char f1, f2, f3, f4;21. // ⼆个插值中间值22. unsigned char f12, f34;23. //计算结果24. int fr,fb,fg;25. double epsilon = 0.001;26. COLORREF pixel11,pixel12,pixel21,pixel22;27. int nHeight1 = m_Image1.GetHeight();28. int nWidth1 = m_Image1.GetWidth();29. int nHeight = m_Image.GetHeight();30. int nWidth = m_Image.GetWidth();31. double m=((double)nWidth1-1)/((double)nWidth-1);32. for (int i=0; i<nWidth1; i++)33. {34. for (int j=0; j<nHeight1; j++)35. {36. double x=double((double)i/m);37. double y=double((double)j/m);38. //计算四个最临近象素的坐标,+1向右下⽅移动39. x1 = (int) x;40. x2 = x1 + 1;41. y1 = (int) y;42. y2 = y1 + 1;43. if( (x < 0) || (x > nWidth - 1) || (y < 0) || (y > nHeight - 1))44. {45. //要计算的点不在源图范围内,返回-146. continue;47. }48. else49. {50. if (fabs(x - nWidth + 1) <= epsilon )51. {52. // 要计算的点在图像右边缘上53. if (fabs(y -nHeight + 1) <= epsilon)54. {55. // 要计算的点正好是图像最右下⾓那⼀个象素,直接返回该点象素值56. pixel11 = m_Image.GetPixel(x1,y1);57. f1 = (unsigned char)GetRValue(pixel11);58. fr=(int)f1;59. f1 = (unsigned char)GetGValue(pixel11);60. fg=(int)f1;61. f1 = (unsigned char)GetBValue(pixel11);62. fb=(int)f1;63. }64. else65. {66. // 在图像右边缘上且不是最后⼀点,直接⼀次插值即可67. pixel11 = m_Image.GetPixel(x1,y1);68. pixel12 = m_Image.GetPixel(x1,y2);69. f1 = (unsigned char)GetRValue(pixel11);70. f3 = (unsigned char)GetRValue(pixel12);71. fr= (int) (f1 + (y -y1) * (f3 - f1));72. f1 = (unsigned char)GetGValue(pixel11);73. f3 = (unsigned char)GetGValue(pixel12);74. fg= (int) (f1 + (y -y1) * (f3 - f1));75. f1 = (unsigned char)GetBValue(pixel11);76. f3 = (unsigned char)GetBValue(pixel12);77. fb= (int) (f1 + (y -y1) * (f3 - f1));78. }79. }80. else if (fabs(y - nHeight + 1) <= epsilon)81. {82. // 要计算的点在图像下边缘上且不是最后⼀点,直接⼀次插值即可83. pixel11 = m_Image.GetPixel(x1,y1);84. pixel21 = m_Image.GetPixel(x2,y1);85. f1 = (unsigned char)GetRValue(pixel11);86. f2 = (unsigned char)GetRValue(pixel21);87. fr=(int) (f1 + (x -x1) * (f2 - f1));88. f1 = (unsigned char)GetGValue(pixel11);89. f2 = (unsigned char)GetGValue(pixel21);90. fg=(int) (f1 + (x -x1) * (f2 - f1));91. f1 = (unsigned char)GetBValue(pixel11);92. f2 = (unsigned char)GetBValue(pixel21);93. fb=(int) (f1 + (x -x1) * (f2 - f1));94. }95. else96. {97. pixel11 = m_Image.GetPixel(x1,y1);98. pixel12 = m_Image.GetPixel(x1,y2);99. pixel21 = m_Image.GetPixel(x2,y1);100. pixel22 = m_Image.GetPixel(x2,y2);101. // 计算四个最临近象素值102. f1 = (unsigned char)GetRValue(pixel11);103. f2 = (unsigned char)GetRValue(pixel21);104. f3 = (unsigned char)GetRValue(pixel12);105. f4 = (unsigned char)GetRValue(pixel22);106. f12 = (unsigned char) (f1 + (x - x1) * (f2 - f1));107. f34 = (unsigned char) (f3 + (x - x1) * (f4 - f3));108. fr= (int) (f12 + (y -y1) * (f34 - f12));109. f1 = (unsigned char)GetGValue(pixel11);110. f2 = (unsigned char)GetGValue(pixel21);111. f3 = (unsigned char)GetGValue(pixel12);112. f4 = (unsigned char)GetGValue(pixel22);113. f12 = (unsigned char) (f1 + (x - x1) * (f2 - f1));114. f34 = (unsigned char) (f3 + (x - x1) * (f4 - f3));115. fg= (int) (f12 + (y -y1) * (f34 - f12));116. f1 = (unsigned char)GetBValue(pixel11);117. f2 = (unsigned char)GetBValue(pixel21);118. f3 = (unsigned char)GetBValue(pixel12);119. f4 = (unsigned char)GetBValue(pixel22);120. f12 = (unsigned char) (f1 + (x - x1) * (f2 - f1));121. f34 = (unsigned char) (f3 + (x - x1) * (f4 - f3));122. fb= (int) (f12 + (y -y1) * (f34 - f12));123. }124. }125. m_Image1.SetPixel(i,j, RGB(fr,fg,fb));126. }127. }128. m_Image.Destroy();129. m_Image.Create( m_Image1.GetWidth(), m_Image1.GetHeight(), 24, 0);130. COLORREF pixel;131. for (int i=0; i<nWidth1; i++)132. {133. for (int j=0; j<nHeight1; j++)134. {135. pixel = m_Image1.GetPixel(i,j);136. int y=GetRValue(pixel);137. int p=GetGValue(pixel);138. int b=GetBValue(pixel);139. m_Image.SetPixelRGB(i,j,GetRValue(pixel),GetGValue(pixel),GetBValue(pixel));140. }141. }142. m_Image1.Destroy();143. Invalidate();144. EndWaitCursor();2)处理视频帧[cpp]1. ……2. Defog(imageprosses, nimgWidth, nimgheigt);/*我加的⼀个雾天图像增强的动态库,imageprosses是视频的⼀帧,输⼊imageprosses处理,并输出imageprosses*/3. int rr = 0, gg = 0, bb = 0;4. for (int i = 0; i < nimgWidth; i++)5. {6. for (int j = 1; j <= nimgheigt; j++)7. {8. bb=(int)imageprosses[3*i*j];9. gg=(int)imageprosses[3*i*j+1];10. rr=(int)imageprosses[3*i*j+2];11. m_Image.SetPixel(i, j-1, RGB(rr,gg,bb));/*设置⼀帧图像的像素值⽤来显⽰*/12. }13. }14. ……2、⽐较:⾮常慢。

MFC序列化保存

MFC序列化保存

MFC序列化保存1说明在使用MFC变成中,有时候我们要保存自定义文件格式。

尤其是在编辑画图的时候有时候需要自定义的图片保存格式,一边打开文件后还可以编辑图片。

这就需要将图像中的类对象保存下来,以便在再次打开的时候还可以编辑,而如果保存为类似于JPG格式的图片就不能在编辑了。

本文主要说明如何用序列化的方法保存自定义格式文件。

2背景假设现在我们需要保存一个自定义的类MyRect,表示一个自定义的矩形的类。

我们要可以保存类得成员变量,并在再一次打开的时候可以读取MyRect的成员变量。

2.1类声明和定义那么首先要注意一点,这个要序列化保存的类必须继承于CObject类。

这里我们的MyRect是继承于CWnd类的,我们知道CWnd是继承于CObject,所以我们的MyRect也是CObject的子类。

下面我们看一下MyRect类得成员变量有四个int型的数x0,y0,x1,y1分别表示矩形的左上角的xy坐标和右下角的xy坐标。

MyRect类得定义如下:DECLARE_DYNAMIC(MyRect)在生成类的时候系统自动添加的代码,是在动态生成类的时候有用的(具体含义我也不是很清楚,感兴趣的同学可以上网查一查)。

由于要使用序列化保存所以我们必须添加第二处标记的那句话DECLARE_SERIAL(MyRect)而这句话已经包含了第一处标记的DECLARE_DYNAMIC(MyRect)的含义,所以同时出现这两个宏定义会出现编译重定义的错误,所以要在添加第二处宏定义的同时标注掉第一处的宏定义。

其中需要我们注意的地方我已经用红色背景标注出来,上面我们已经提到了,要序列化保存一个类对象,那么这个类必须是CObject的子类,为什么?应为CObject类提供了一个Serialize(CArchive& ar)的函数,所以已经这类以后,我们需要实现这个函数,也就是要告诉程序,在序列化的时候我们需要保存类的那些成员变量,下面是在Myrect.cpp实现:标注的第一处和第二处和声明中的是对应的,添加IMPLEMENT_SERIAL(MyRect,CObject,1)同时标注掉IMPLEMENT_DYNAMIC(MyRect, CWnd)。

VC图像库及图像加载方法

VC图像库及图像加载方法

VC++几种图像库及图像加载方法一、使用CImage类加载用CImage类的Load函数加载图片,之后用Detach()取得HBITMAP句柄,取得图片的HBITMAP句柄后就可以像操作BMP图片一样处理JPG/JPEG/GIF/PNG CImage img;HRESULT ret=image.Load(filename);//filenam 是要加载的文件名路径HBITMAP bitmap=img.Detach()//像操作BMP图片一样处理图片CString str_Photo = theApp.m_UserPhoto ;if ((str_Photo.Right(3)==_T("bmp"))||(str_Photo.Right(3)==_T("BMP"))){CDC *pDC = m_Picture.GetDC();CRect m_Rect;m_Picture.GetClientRect(&m_Rect);CDC dc;dc.CreateCompatibleDC(pDC);//CreateCompatibleDCHBITMAP hBitmap;hBitmap = (HBITMAP)LoadImage(NULL,str_Photo,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE |LR_LOADFROMFILE);CBitmap m_Bitmap;m_Bitmap.Attach(hBitmap);//loadBitmap;dc.SelectObject(&m_Bitmap);BITMAP bmp;m_Bitmap.GetBitmap(&bmp);pDC->StretchBlt(m_Rect.left,m_Rect.top,m_Rect.Width() ,m_Rect.Height(),&dc,0,0, bmp.bmWidth,bmp.bmHeight,SRCCOPY);dc.DeleteDC();}else if ((str_Photo.Right(3)==_T("jpg"))||(str_Photo.Right(3)==_T("JPG"))){IStream *m_pStream;//定义流对象IPicture *m_pPicture;//定义接口对象OLE_XSIZE_HIMETRIC m_JpgWidth; //jpg widthOLE_XSIZE_HIMETRIC m_JpgHeight;//jpg heightHGLOBAL hMem; //定义堆句柄CFile m_File;m_File.Open(str_Photo,CFile::modeReadWrite); ///读文件ULONGLONG filesize = m_File.GetLength();///get file lengthhMem = GlobalAlloc(GMEM_MOVEABLE,filesize);///alloc meomeryLPVOID pData = NULL;pData = GlobalLock(hMem); //lock the meomry areym_File.Read(pData,filesize);///read file to the meomerym_File.Close();GlobalUnlock(hMem);CreateStreamOnHGlobal(hMem,TRUE,&m_pStream);OleLoadPicture(m_pStream,filesize,TRUE,IID_IPicture,(LPVOID*)&m_pPicture);m_pPicture->get_Width(&m_JpgWidth);m_pPicture->get_Height(&m_JpgHeight);CDC *pDC = m_Picture.GetDC();CDC dc;dc.CreateCompatibleDC(pDC);CRect rect;m_Picture.GetClientRect(&rect);m_pPicture->Render(pDC->m_hDC,rect.left,rect.top,rect.Width(),rect.Height(),0,m_J pgHeight,m_JpgWidth,-m_JpgHeight,NULL);GlobalFree(hMem);DeleteDC(dc);}这是读取图片路径读取BMP或JPG图像,并显示。

使用CxImage实现图像格式转换(word文档良心出品)

使用CxImage实现图像格式转换(word文档良心出品)

使用CxImage实现图像格式转换●引言目前CxImage支持的图像格式包括:bmp、gif、jpg、png、ico、tif、tga、pcx、wbmp、wmf、jp2、jpc、pgx、pnm、ras、jbg、mng、ska、raw和psd;CxImage中所包含的图像操作可通过打开index.htm来查看;●下载与解压1.从/projects/cximage/下载最新的cximage702_full源码,并解压到文件夹cximage702_full中;●编译cximage702_full2.以管理员身份打开cximage702_full文件夹下的CxImageFull_vc10.sln工程,便可看到解决方案中的14个项目:注:vs2010设置以管理员身份启动的方法:(右击快捷键,选择以管理员身份启动即可)a. 找到VS2010的快捷方式:右击打开文件位置b. 找到VS2010的启动项目devenv.exe :右击属性兼容性特权等级,以管理员权限运行;如果需要每个用户都以管理员权限运行,还可以更改所有用户的设置特权等级,以管理员权限运行。

c. 然后在项目的打开方式中确保以VS2010为默认打开程序就好了。

其中cximagecrtdll, cxiamgemfcdll 是用以支持动态链接库的方式加入所需的项目,如果不需要动态链接,则不需要编译运行;demo 和demodll 是示例的两个项目,其实是一个项目的不同的外部链接输入配置,前者使用静态链接,后者使用动态链接。

动态链接和静态链接项目所需的库除了头文件外是完全不一样的。

3.在编译之前先将每个工程属性的Character Set由原先的Use Unicode Character Set改为Use Multi-ByteCharacter Set(否则,在使用该库时,会出现类似:error C2664: 'CxImage::Save' : cannot convert parameter 1 from 'const char *' to 'const TCHAR *'的错误)。

MFC CImageList详解

MFC CImageList详解

MFC CImageList 详解2010-12-23 21:28图像列表控件(CImageList)是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,(可以把这些图标看成是以数组方式存储的),图像列表通常由大图标或位图构成,其中包含透明位图模式(实际上,所有的再一个图像列表中的图标都被存储在一个屏幕设备的位图中)。

可以利用windows API来绘制、建立和删除图像,并能实现增加、删除、替换和拖动图像邓操作。

图像列表控件提供了控制图像列表额基本方法,这些方法在Windows 95及以后版本才能实现。

该控件是不可见的,通常与其他如CListBox、CComboBox、CComboBoxEx以及CTabCtrl一起使用,为他们提供图标资源。

一、图像控件的对象结构1 图像控件的数据成员m_hImageList连接图像对象的控件句柄2 图像控件的建立方法CImageList& ImageList建立图像控件对象结构,Create初始化图像列表并绑定对象,图像控件的建立方法如下BOOL Create(int cx,int cy,UINT nFlags,int nInitial,int nGrow);BOOL Create(UINT nBitmapID,int cx,int nGrow,COLORREF crMask);BOOL Create(LPCTSTR lpszBitmapID,int cx,int nGrow,COLORREF crMask);BOOL Create(CImageList& imageList1,int nImage1,CImageList& imagelist2,int nImage2,int dx,int dy);其中各项参数的含义为:cx定义图像的宽度,单位为像素;cy定义图像的高度,单位为像素;nFlags确定建立图像列表的类型,可以是以下值的组合:ILC_COLOR、ILC_COLOR4、ILC_COLOR8、ILC_COLOR16、ILC_COLOR24、ILC_COLOR32、 ILC_COLORDDB和ILS_MASK;nInitial用来确定图像列表包含的图像;nGrow用来确定图像列表可控制的图像数量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何将MFC图片框中画的图形用CImage保存成多种格式:
将下列代码拷到你想执行的命令函数中(比如按钮函数或者菜单函数)即可
其中IDC_STATIC2这个就是你想保存的控件ID
//改变Hwnd即可以得到不同控件的句柄
//整个对话框中每个元素都是一个窗体!
HWND hwnd = GetDlgItem(IDC_STATIC2)->GetSafeHwnd();
HDC hDC = ::GetWindowDC(hwnd);//获取DC
RECT rect;
::GetWindowRect(hwnd, &rect);//获取屏幕大小
HDC hDCMem = ::CreateCompatibleDC(hDC);//创建兼容DC
HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right-rect.left, rect.bottom-rect.top);//创建兼容位图
HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap);//将位图选入DC,并保存返回值
::BitBlt(hDCMem, 0, 0, rect.right-rect.left, rect.bottom-rect.top, hDC, 0, 0, SRCCOPY);//将屏幕DC的图象复制到内存DC中
CImage image;//需要#include <atlimage.h>
image.Attach(hBitMap);
//image.Save(_T("c:\\B.jpg"));//如果文件后缀为.bmp,则保存为为bmp格式
//以下程序用于选择图片保存路径等信息
CString strFilter="位图文件(*.bmp)|*.bmp|JPEG 图像文件|*.jpg|GIF 图像文件|*.gif|PNG 图像文件|*.png||";
CFileDialog dlg(FALSE,"bmp","untitled.bmp",NULL,strFilter);
if ( IDOK != dlg.DoModal())
return;
// 如果用户没有指定文件扩展名,则为其添加一个
CString strFileName;
CString strExtension;
strFileName = dlg.m_ofn.lpstrFile;
if (dlg.m_ofn.nFileExtension == 0)
{
switch (dlg.m_ofn.nFilterIndex)
{
case 1:
strExtension = "bmp"; break;
case 2:
strExtension = "jpg"; break;
case 3:
strExtension = "gif"; break;
case 4:
strExtension = "png"; break;
default:
break;
}
strFileName = strFileName + '.' + strExtension;
}
// 图像保存
HRESULT hResult = image.Save(strFileName);
if (FAILED(hResult))
MessageBox("保存图像文件失败!");
else
MessageBox("保存图像文件成功!");
image.Detach();
::SelectObject(hDCMem, hOldMap);//选入上次的返回值
//释放
::DeleteObject(hBitMap);
::DeleteDC(hDCMem);
::DeleteDC(hDC);。

相关文档
最新文档