如何将MFC图片框中画的图形用CImage保存成多种格式
- 格式:docx
- 大小:12.90 KB
- 文档页数:2
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是免费开源的使用简单的图形处理程序,在这里演示了两个功能。
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 在对话框显示图片的多种方法我们先从简单的开始吧.先分一个类:(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定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. 首先应该保证系统中有这个控件。
我们知道,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 图形的重绘与保存-- 总结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 来构造,只是为了防止局部对象在退出其作用域后被销毁所引起的错误。
利用 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是一个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一段时间后,试着要用对话框打开一幅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是一个可以用于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类的介绍与使用程序代码下载处:/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用来设置某种颜色是透明色。
如何将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);。