mfc图像格式转化
如何将MFC图片框中画的图形用CImage保存成多种格式
如何将MFC图片框中画的图形用CImage保存成多种格式:将下列代码拷到你想执行的命令函数中(比如按钮函数或者菜单函数)即可其中IDC_STATIC2这个就是你想保存的控件ID//改变Hwnd即可以得到不同控件的句柄//整个对话框中每个元素都是一个窗体!HWND hwnd = GetDlgItem(IDC_STATIC2)->GetSafeHwnd();HDC hDC = ::GetWindowDC(hwnd);//获取DCRECT rect;::GetWindowRect(hwnd, &rect);//获取屏幕大小HDC hDCMem = ::CreateCompatibleDC(hDC);//创建兼容DCHBITMAP 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("保存图像文件失败!");elseMessageBox("保存图像文件成功!");image.Detach();::SelectObject(hDCMem, hOldMap);//选入上次的返回值//释放::DeleteObject(hBitMap);::DeleteDC(hDCMem);::DeleteDC(hDC);。
mfc空间几何变换之图像平移、镜像、旋转、缩放详解
MFC空间几何变换之图像平移、镜像、旋转、缩放详解一. 图像平移前一篇文章讲述了图像点运算(基于像素的图像变换),这篇文章讲述的是图像几何变换:在不改变图像容的情况下对图像像素进行空间几何变换的处理方式。
点运算对单幅图像做处理,不改变像素的空间位置;代数运算对多幅图像做处理,也不改变像素的空间位置;几何运算对单幅图像做处理,改变像素的空间位置,几何运算包括两个独立的算法:空间变换算法和灰度级插值算法。
空间变换操作包括简单空间变换、多项式卷绕和几何校正、控制栅格插值和图像卷绕,这里主要讲述简单的空间变换,如图像平移、镜像、缩放和旋转。
主要是通过线性代数中的齐次坐标变换。
图像平移坐标变换如下:运行效果如下图所示,其中BMP图片(0,0)像素点为左下角。
其代码核心算法:1.在对话框中输入平移坐标(x,y) m_xPY=x,m_yPY=y2.定义Place=dlg.m_yPY*m_nWidth*3 表示当前m_yPY行需要填充为黑色3.新建一个像素矩阵ImageSize=new unsigned char[m_nImage]4.循环整个像素矩阵处理for(int i=0 ; i<m_nImage ; i++ ){if(i<Place) {ImageSize[i]=black;continue;}//黑色填充底部从小往上绘图else if(i>=Place && countWidth<dlg.m_xPY*3) {//黑色填充左部分ImageSize[i]=black;countWidth++; continue;}else if(i>=Place && countWidth>=dlg.m_xPY*3) {//图像像素平移区域ImageSize[i]=m_pImage[m_pImagePlace];//原(0,0)像素赋值过去m_pImagePlace++;countWidth++;if(countWidth==m_nWidth*3) {//一行填满m_pImagePlace走到(0,1)number++;m_pImagePlace=number*m_nWidth*3;}}}5.写文件绘图fwrite(ImageSize,m_nImage,1,fpw)第一步:在ResourceView资源视图中,添加Menu子菜单如下:(注意ID号)第二步:设置平移对话框。
mfc中format函数
mfc中format函数摘要:1.MFC中的Format函数简介2.Format函数的用途和应用场景3.Format函数的参数及其作用4.示例:使用Format函数输出带格式的字符串5.总结与建议正文:【1】MFC中的Format函数简介在MFC(Microsoft Foundation Class)库中,Format函数是一个非常实用的字符串格式化工具。
它允许程序员在运行时动态生成格式化的字符串,从而方便地处理各种各样的数据类型。
Format函数类似于C语言中的printf 函数,但它具有更强的功能和更高的灵活性。
【2】Format函数的用途和应用场景Format函数的主要用途是将不同类型的数据整合到一起,形成一个格式化的字符串。
这在处理数据显示、日志记录、消息提示等场景时非常有用。
例如,在一个程序中需要输出一个带有数值的字符串,可以使用Format函数将数值和字符串进行拼接。
【3】Format函数的参数及其作用Format函数的语法如下:```CString Format(const CString& format, ...);```其中,format参数是一个格式化字符串,用于指定输出字符串的格式。
后面的参数则是需要格式化的数据,可以通过占位符(如%s、%d、%f等)指定。
【4】示例:使用Format函数输出带格式的字符串以下是一个使用Format函数的示例:```cppCString str;int num = 123;float fnum = 3.14;str.Format(_T("姓名:%s,年龄:%d,身高:%f"), name, age, height);AfxMessageBox(str);```在这个示例中,我们使用Format函数将姓名、年龄和身高等信息拼接成一个字符串,并使用AfxMessageBox显示输出。
【5】总结与建议MFC中的Format函数是一个非常实用的字符串格式化工具,可以帮助程序员轻松地处理各种数据类型。
MFC 读取并显示图片和彩色转灰度
By侯海艳(UCAS)
关于MFC读取BMP图片,相信对于很多初学者都是一头雾水,找不着头绪。那么就让我浅浅地说一说到底怎么样读取并显示BMP图片吧。因为我也是初学,摸索学习了四五天,由于有些MFC基础,因此大概理清了MFC读取图片的机理。说的不对请提出宝贵建议,高手请绕道。
C++的学习难就难在指针上面,我们必须很好地了解数据的存储方式和指针的基本知识。一般来说,数据存储在内存中是以内存块的形式存储的,即给变量分配一定大小的空间,这个空间就像书架一样,里面装满了一本一本的书,每本书就对应着一个数据单元。我们定义一个指针,指向这个内存块,指针的位置就在内存块的开头,即数据的第一个元素。当我们要获取后面的元素的时候就要移动指针获取。下面会具体说。
1.从新建MFC文档开始
新建MFC文档的时候,可以选择多文档类型,一般选择默认,但有一点需要注意,当新建这只到了第六步的时候,C*View类的Base Class要选择CScrollView,而不是默认的CView。如下图:Teeee是我随便命名的工程名
(旋转了90度)
这样打开文档就可以看到上图中有许多文件,我们所要编辑的主要是Doc.cpp、View.cpp和Header Files里面的Doc.h头文件。
if ( rowBytes!=pDoc->m_Width*pDoc->m_PxlBytes )
{
pBuf = new BYTE[pDoc->m_Height*rowBytes];
for (int i=0;i<pDoc->m_Height;i++ )
memcpy( pBuf+i*rowBytes,pDoc->pImgData+i*pDoc->m_Width*pDoc->m_PxlBytes,pDoc->m_Width*pDoc->m_PxlBytes );
mfc动态显示图片(bmp以及png)
mfc动态显⽰图⽚(bmp以及png)之前写过win32动态显⽰图⽚的博客(程序线程检测图⽚变动⾃动刷新,⽽⾮按按钮再刷新的情况),这次⽤到了mfc。
原理是⼀样的。
OnInitDialog函数初始化BOOL CXxxDlg::OnInitDialog(){CDialog::OnInitDialog();if (m_bmp.m_hObject != NULL)m_bmp.DeleteObject();/*载⼊图⽚*/HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),L"initPic.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); if (hbmp == NULL)return FALSE;/*取得加载的BMP的信息*/m_bmp.Attach(hbmp);DIBSECTION ds;BITMAPINFOHEADER &bminfo = ds.dsBmih;m_bmp.GetObject(sizeof(ds), &ds);int cx = bminfo.biWidth;int cy = bminfo.biHeight;/*得到了图像的宽度和⾼度后,对图像⼤⼩进⾏适应,即调整控件的⼤⼩,让它正好显⽰⼀张图⽚*/CRect rect;GetDlgItem(IDC_PIC_ZONE)->GetWindowRect(&rect);ScreenToClient(&rect);/*调整⼤⼩*/GetDlgItem(IDC_PIC_ZONE)->MoveWindow(rect.left, rect.top, cx, cy, true);return TRUE;}OnPaint具体画图。
IDC_PIC_ZONE为picture control控件。
convert命令用法
convert命令用法convert命令是一款非常实用的图像处理工具,它可以对图片进行格式转换、大小调整、颜色空间转换、图片裁剪、加入水印等多种操作。
以下是convert命令的用法:1. 格式转换:将PNG图片转为JPG格式:convert input.png output.jpg将JPG图片转为PNG格式:convert input.jpg output.png2. 大小调整:将图片宽度调整为400像素:convert input.jpg -resize 400 output.jpg将图片高度调整为300像素:convert input.jpg -resize x300 output.jpg同时调整宽度和高度:convert input.jpg -resize 400x300 output.jpg3. 颜色空间转换:将RGB色彩空间转换为CMYK色彩空间:convert input.jpg-colorspace cmyk output.jpg将CMYK色彩空间转换为RGB色彩空间:convert input.jpg-colorspace rgb output.jpg4. 图片裁剪:将图片从左上角裁剪出200x200的区域:convert input.jpg-crop 200x200+0+0 output.jpg将图片从中心裁剪出300x300的区域:convert input.jpg -crop 300x300+100+100 output.jpg5. 加入水印:在图片左上角加入文字水印:convert input.jpg -pointsize 24 -draw 'text 10,10 'watermark'' output.jpg在图片中央加入图片水印:convert input.jpg watermark.jpg -gravity center -composite output.jpg以上是convert命令的常用用法,可以满足大部分图片处理需求。
1.MFC-导入显示bmp图片
数字图像处理- MFC教程第一课建立MFC和打开bmp图片第一步:建立MFC工程文件--新建--MFC AppWizardd(exe)工程--单文档—确定。
第二步:设置打开函数查看--建立类导向(Ctrl+W)--CpictureXSView(类名)--ID_FILE_OPEN(IDs列表)--COMMAND(Messages列表)--默认成员函数名为OnFileOpen--Member Functions(成员函数)中双击该函数进入函数编辑。
建立如下函数:打开图片、保存图片为重点。
注意:在添加Messages列表中:ON_COMMAND是点了按钮或菜单项后的响应消息;ON_UPDATE_COMMAND_UI是用来表示对应的按钮和菜单项的状态的响应消息,比如你打开这个菜单时,处理这个菜单的状态,比如选中、变灰等。
UPDATE_COMMAND_UI处理程序的参数是个「指向CCmdUI对象的指针」,而CCmdUI对象就代表着对应的选单命令项,因此你只需呼叫 CCmdUI 所准备的,专门用来处理命令项外观的函式(如Enable或SetCheck)即可。
第三步:View类添加成员函数和成员变量//参数定义p u b l i c:C S t r i n g B mp N a me;//保存图像文件文件名C S t r i n g E n t N a me;//保存图像文件扩展名C B i t map m_b i t map;//创建位图对象v o i d S h o wB i t map(C D C*p D C,C S t r i n g B mp N a me);//用来显示指定位图b mp的函数B O O L S h o w Jp g G i f(CD C*p D C,C S t r i n g st r P a t h,i n t x,i n t y);//用来显示指定位图j p g、g i f的函数添加方法:选中ClassView区--选中View类右键--增加成员变量函数。
在MFC程序中显示JPGGIF图像
CPicture pic(ID_MYPIC); // 加载图像
CRect rc(0,0,0,0);
// 使用缺省的rc
pic.Render(pDC, rc);
// 显示图像
CPicture::Render提供一个显示图片的矩形。IPicture 对图像进行延伸处理。如果传递一个空矩形,则CPicture用图像 本身的大小--不进行延伸处理。对于图像本身而言,CPicture查找"IMAGE"类型的资源,所以在资源文件中你必须要加 入下面的代码:
PictureChanged
通知图像对象它的图像资源改变了
SaveAsFile
将图像数据存储到流中,格式与存成文件格式相同
get_Attributes
返回图像位属性当前的设置
从上面这个表可以看出,IPicture操纵着图像对象及其属性。图像对象提供对位图的抽象,而Windows负 责BMP、JPG和GIF位图的标准实现。程序员要做的只是实例化IPicture ,然后调用其Render 函数。与通常使用接口的方 式不同,这里实例的创建我们不用CoCreateInstance函数,而是用一个专门的函数OleLoadPicture。
GetImageRect 是CPictureView 类的一个成员函数,作用是根据当前Myimgapp 的缩放比率(可 用25%、33%、50%、75%、100%或自适应方式)获取图像矩形。GetImageRect 调用CPicture::GetImageSize 来获 得真正的图像大小,然后根据比率显示。 CPictureView其余的部分完全和CScrollView的做法差不多,初始化视图并设
方法
描述
ห้องสมุดไป่ตู้
资料3:图形图像文件格式转换
资料3:图形图像文件格式转换图片包括图形(Graphic)和图像(Still Image)两种。
图形指的是从点、线、面到三维空间的黑白或彩色几何图,也称矢量图(Vector Graphic)。
一般所说的图像,指的是静态图像,静态图像是一个矩阵,其元素代表空间的一个点,称之为像素点(Pixel),这种图像也称位图。
位图中的位(Bit)用来定义图中每个像素点的颜色和亮度。
对于黑白线条图常用1位值表示,对灰度图常用4位(16种灰度等级)或8位(256种灰度等级)表示该点的亮度,而彩色图像则有多种描述方法。
位图图像适合于表现层次和色彩比较丰富、包含大量细节的图像。
彩色图像需要由硬件(显示卡)合成显示。
1、常见的图形图像文件格式常见的图形图像格式有很多种:BMP、JPEG、GIF、TIFF、PSD。
(1)BMP格式BMP格式是Windows的通用图像格式。
该格式的图像无压缩,数据量较大,在多媒体节目制作中,通常不直接使用BMP格式的图像文件,只是在图像编辑和处理的中间过程使用它保存最真实的图像效果,编辑完成后转换成其他图像文件格式,再应用到多媒体项目制作中。
(2)JPG格式JPG格式是是一种压缩格式。
因为JPG图像的压缩比很高,因此文件非常小,非常适用于要处理大量图像的场合。
JPG图像格式是目前应用范围非常广泛的一种图像文件格式。
但是,JPG格式不支持Alpha通道,采用这种格式的图像,适于作为背景素材,而不适于作为前景素材。
(3)GIF格式GIF格式是一种压缩的256色图像格式。
它的特点是:数据量小,适合于网络传输。
(4)PSD格式PSD格式是图像处理软件Photoshop的专用图像格式。
这种格式的文件容量很大,不适宜直接将这种格式的图像作为素材使用,而应该转换成文件容量更小的图像格式后再使用。
保存这种格式文件的目的,是为了日后修改和继续编辑。
我们要注意:影响文件大小的另一因素是文件格式。
由于GIF、JPEG 和PNG 文件格式所使用的压缩方法不同,因此,即使像素尺寸相同,文件大小也明显不同。
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类的介绍与使用程序代码下载处:/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用来设置某种颜色是透明色。
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简介和许可CxImaage是一个可以简便而快速地打开,保存,显示和转换图像文件的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图像。
eps,emf,jpg格式相互转换方法
在图片的目录,按住shift+鼠标右键,选择“在此处打开命令窗口”的选项,在该cmd输入bmeps -c image1.jpg image2.eps其中-c是使图片彩色输出,其中image1为原图,image2为所要输出的eps格式的图。
myfigure1 MATLAB保存的eps图片以插入对象中的文字方式插入转为PDF的文件效果还可以The proportion of training dataPDF拍快照复制粘贴效果差直接修改后缀名为emf不可取插入fig保存的wmf插入fig保存的eps插入fig保存的png插入fig保存的jpg结论:Word导入图片清晰度emf > png >jpg,Word导入eps格式图片会使线条加粗由于eps,pdf 属于adobe公司,visio, emf为微软产品,两家存在竞争不能直接以另存为的方式转化。
LaTeX中常用eps,Word中常用emf,可通过PDF格式相互转化,PDF保存时应选择高质量打印模式viso图是无法直接导出eps格式的论文图片格式一些讨论:常用图片格式:jpg、png、bmp、emf、eps等·其中jpg压缩率高,优点是文件体积小但是图片质量严重下降·png位图格式,最突出的优点是支持透明特性,因此广泛应用于网络、图标·emf和eps同为矢量格式,放大不失真,因此Word和Latex排版常用这两种格式图片,尤其是坐标图表采用jpg格式会变得很模糊重点:Word中图片尽可能采用emf格式,Latex中常用eps格式[注:小编亲测Word导入图片清晰度emf > png >jpg,Word导入eps格式图片会使线条加粗] 然而,问题是:eps,pdf 属于adobe公司,visio, emf为微软产品,两家存在竞争不能直接以另存为的方式转化解决方案:(注:还有N种较复杂方案,自行百度)(1)jpg、png格式转eps的方法:在图片的目录,按住shift+鼠标右键,选择“在此处打开命令窗口”的选项,在该cmd输入bmeps -c image1.jpg image2.eps其中-c是使图片彩色输出,其中image1为原图,image2为所要输出的eps格式的图。
mfc bitmap 用法
mfc bitmap 用法MFC(Microsoft Foundation Classes)是一个封装了一系列用于开发Windows应用程序的C++类库。
在MFC中,可以使用CBitmap类来创建和处理位图对象。
CBitmap类提供了许多用于处理位图的方法和函数,以下是一些常用的用法:1.创建位图对象:使用CBitmap的CreateBitmap函数可以根据指定的参数创建一个新的位图对象。
例如:```cppCBitmap bitmap;bitmap.CreateBitmap(width, height, bitsPerPixel, numColors, pData);```其中,width和height分别表示位图的宽度和高度,bitsPerPixel表示每个像素的位数,numColors表示使用的颜色数,pData是指向位图数据的指针。
2.加载位图资源:使用CBitmap的LoadBitmap函数可以从资源文件中加载位图。
例如:```cppCBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);```其中,IDB_BITMAP1是资源文件中位图资源的标识符。
3.显示位图:使用CBitmap的GetDC函数获取设备上下文(DC),然后调用CDC 类的BitBlt函数将位图绘制到设备上下文中(或者使用其他绘制函数,如StretchBlt等)。
例如:```cppCDC dc;dc.CreateCompatibleDC();CBitmap* pOldBitmap = dc.SelectObject(&bitmap);dc.BitBlt(x, y, width, height, &dc, 0, 0, SRCCOPY);dc.SelectObject(pOldBitmap);```其中,x和y是位图在设备上下文中的起始位置,width和height 是位图的宽度和高度。
VS2008环境下基于MFC读取显示图像、更改背景图像
一、创建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 是非常麻烦的。
使用Unicode 在编译时可能会遇到下列错误:cannot convert parameter 1 from 'CString' to 'const char *'cannot convert from 'const char [11]' to 'LPCWSTR'这意味着在Unicode 和Multi-byte字符串的转换中出现了问题。
在上一篇学习笔记中,就提到“成员函数LoadBMP其输入参数类型应为const char*”,那应该只是一个治标的方法,这里的去掉“Use Unicode libraries”选项,才是治本之道。
Windows系统中的常见文件格式转换方法
Windows系统中的常见文件格式转换方法在日常工作和学习中,我们经常会遇到需要进行文件格式转换的情况。
无论是转换文档、图片、音频还是视频文件格式,Windows系统提供了多种简便而高效的方法来完成这一任务。
本文将介绍常见的文件格式转换方法,帮助您快速处理不同格式的文件。
一、文档文件格式转换1. Microsoft Office应用程序:Windows系统上安装了Microsoft Office软件套件后,您可以使用其中的Word、Excel和PowerPoint等应用程序进行文档文件格式转换。
只需打开目标文件,然后选择“另存为”选项,在保存类型中选择您需要的格式,点击保存即可完成转换。
2. 在线文档转换工具:如果您不希望安装额外的软件或使用Microsoft Office程序,还可以使用在线文档转换工具进行格式转换。
例如,Zamzar、SmallPDF和Adobe Acrobat等在线工具都提供了文档文件格式转换服务。
打开相应的网页,上传要转换的文件,选择目标格式,然后点击转换即可下载转换后的文件。
二、图片文件格式转换1. Windows系统内置图片查看器:Windows系统自带的图片查看器(照片)提供了简单的图片格式转换功能。
只需打开要转换的图片,在菜单栏中选择“文件”-“另存为”,然后选择您需要的格式并保存。
2. 图片格式转换工具:除了系统自带的图片查看器外,还有许多专业的图片格式转换工具可供选择。
例如,IrfanView和XnConvert等软件提供了更多的批量转换选项和高级设置,可以满足不同转换需求。
三、音频文件格式转换1. Windows媒体播放器:Windows系统自带的媒体播放器提供了基本的音频转换功能。
只需打开媒体播放器,将要转换的音频文件拖放到播放器界面中,然后选择“文件”-“转换”选项,选择目标格式并保存即可完成转换。
2. 音频格式转换软件:如果需要更多的音频格式转换选项和功能,可以使用专业的音频格式转换软件。
mfc中format函数
mfc中format函数MFC中的format函数是一个非常有用的函数,它可以帮助我们格式化字符串。
格式化字符串在编程中非常常见,比如我们需要显示一个带有动态内容的字符串,或者我们需要将一个数值转换为特定格式的字符串。
在本文中,我将一步一步回答有关MFC中的format函数的问题,以帮助您更好地理解和使用它。
第一步:了解format函数的基本用法MFC中的format函数在CString类中定义,它的基本用法如下:CString str;str.Format(_T("格式化字符串"), 参数1, 参数2, ...);其中str 是用于保存格式化结果的字符串,格式化字符串则根据我们的需求来定义,它可以包含普通文本和特殊的格式化标记。
后面的参数是根据格式化字符串中的标记来填充相应的值,可以有多个参数。
第二步:使用普通文本格式化字符串通常包含普通文本,这些文本将直接被输出到结果字符串中。
例如,我们要在结果字符串中显示"Hello, World!",可以使用以下代码:CString str;str.Format(_T("Hello, World!"));在上述代码中,format函数会将文本"Hello, World!"原样输出到结果字符串中。
第三步:使用格式化标记格式化标记是格式化字符串中的特殊标记,它们会被替换为我们提供的值。
在MFC中的format函数中,常用的格式化标记包括:d(十进制整数)、f(浮点数)、s(字符串)等。
下面是一个例子:int age = 25;CString str;str.Format(_T("我今年d岁了"), age);在上述代码中,我们使用了d标记,将变量age的值插入到字符串中。
第四步:处理多个参数有时,我们需要在格式化字符串中插入多个参数。
MFC中的format函数可以处理任意数量的参数,只需要按照相应的格式化标记进行填充即可。
mfc默认编码格式
mfc默认编码格式
MFC(Microsoft Foundation Class)是微软公司提供的一种用于开发基于Windows的应用程序的类库。
MFC 默认的编码格式是使用 Windows API 提供的 Unicode 编码格式,也就是双字节字符集(Unicode),这是因为 Unicode 能够支持全球范围内的各种语言和字符,包括中文、日文、韩文等。
在 MFC 中,通常使用宽字符(wchar_t)来表示 Unicode 字符,以确保对各种语言的支持。
在 MFC 中,默认的字符集是 Unicode,这意味着在创建 MFC 应用程序时,字符类型会被自动设置为 Unicode。
这样做的好处是可以避免在处理多语言字符时出现乱码或无法显示的情况,确保应用程序在全球范围内的用户都能够正常使用。
需要注意的是,虽然 MFC 默认采用 Unicode 编码格式,但也可以通过设置来改变默认的编码格式。
在 MFC 应用程序中,可以通过修改项目属性中的字符集设置来切换到其他编码格式,比如多字节字符集(MBCS)或者使用 ASCII 字符集。
这样做可能会导致一些字符显示或处理上的问题,所以在切换编码格式时需要谨慎考虑,并进行相应的测试和调整。
总的来说,MFC 默认的编码格式是 Unicode,这使得 MFC 应用程序能够更好地支持多语言和多种字符集,但也可以根据需要进行设置和调整。
mfc blendfunction用法
mfc blendfunction用法MFC BlendFunction用法简介MFC(Microsoft Foundation Class)是一种为Windows操作系统开发应用程序的C++类库。
BlendFunction是MFC中的一个结构体,用于设置图像的混合效果。
在本文中,我们将介绍MFC BlendFunction的用法及其作用。
BlendFunction结构体包含了4个成员变量,分别是BlendOp、BlendFlags、SourceConstantAlpha和AlphaFormat。
下面我们逐一介绍这些成员变量的作用:1. BlendOp:指定混合操作的类型。
常见的操作有AC_SRC_OVER、AC_SRC_ALPHA等。
AC_SRC_OVER表示源图像覆盖目标图像,AC_SRC_ALPHA表示源图像根据源图像的alpha通道透明度将源图像与目标图像混合。
2. BlendFlags:指定混合标志。
常见的标志有BLEND_ALPHA_CONSTANT、BLEND_ALPHA_PRESERVE、BLEND_ALPHA_FORMAT和BLEND_ALPHA_DISABLE等。
3. SourceConstantAlpha:指定源图像的不透明度。
该值介于0和255之间,其中0表示完全透明,255表示完全不透明。
4. AlphaFormat:指定源图像的alpha通道格式。
常见的格式有AC_SRC_ALPHA_PREMUL、AC_SRC_ALPHA_NONPREMUL等。
使用MFC BlendFunction可以实现图像的混合效果,如图像的透明、半透明或自定义的混合效果。
我们可以通过以下步骤来使用BlendFunction:1. 创建一个CImage对象,加载源图像和目标图像。
2. 定义一个BlendFunction对象,并设置其成员变量的值。
3. 调用CImage对象的AlphaBlend函数,传入目标图像的HDC、源图像的HDC、目标图像的位置和大小以及BlendFunction对象。
mfc默认编码格式 -回复
mfc默认编码格式-回复MFC(Microsoft Foundation Classes)是一种用于开发Windows应用程序的C++类库。
在MFC中,默认编码格式是基于Unicode字符集的。
这个默认编码格式的设定是有一定历史原因的,与Windows操作系统的发展和国际化需求密切相关。
在本文中,我们将一步一步回答关于MFC 默认编码格式的问题,并探讨为何要采用Unicode作为默认编码格式以及如何在MFC中进行编码转换。
首先,我们需要了解什么是编码格式。
编码格式是一种将字符映射到数字代码的规则。
在计算机中,所有的字符都可以用数字表示。
不同的编码格式采用不同的字符映射规则,将字符和数字代码进行关联。
在早期的计算机系统中,使用的是ASCII编码格式,它只能表示英文字符和一些常见的符号。
然而,随着计算机的普及和国际化的需求增长,ASCII编码的字符范围已经无法满足需求了。
为解决字符编码的限制,主要出现了两种解决方案:多字节编码和Unicode编码。
多字节编码通过使用多个字节来表示一个字符,可以表示更多的字符,但是在不同的编码方式之间进行转换时可能会出现乱码的问题。
而Unicode编码采用固定的两个字节来表示一个字符,可以表示几乎所有国家和地区的字符,解决了多字节编码的转换问题。
在原始的MFC类库中,默认采用的是基于ANSI编码(也称作MBCS,多字节字符集)的编码格式。
这是因为在早期的Windows版本中,多字节编码是主要的字符编码方式。
然而,随着Windows的发展和全球化的需求,Unicode编码逐渐成为主流。
为了适应这一变化,微软于1995年引入了一个新的MFC类库版本(MFC 4.2),默认采用的编码格式是Unicode字符集。
Unicode编码格式在MFC中被称为UNICODE编码。
它与ANSI编码之间的转换并不简单,因为它们采用了不同的字符编码规则。
为了进行编码转换,MFC提供了一些用于转换的函数,如MultiByteToWideChar和WideCharToMultiByte。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
色彩鲜艳漂亮的高品质图像,一个个形象的Windows图标,高速运动、活灵活现的三维动画,这些生动的图形无一不显示着程序设计者的艺术才华。
在程序设计中,图像处理已经成了每个程序员的必修课,所以,对于每个程序员来说,熟悉“BMP”、“GIF”、“JPEG”图像格式及具体应用、调色板、图像文件头格式、图像压缩算法等概念似乎已经成了工作中不可缺少的基础知识。
面对如此多的图像格式,如果要全部掌握其具体细节,好像这对程序员有些不公。
在VC中编程显示一幅位图,下列的步骤是不可少的:装入位图、获得位图的大小信息、启用设备环境、位传输,所需的程序代码显得千篇一律的冗长。
如果想要装入的位图另存为其他格式的图像文件……?两个字:头疼!而这一切都是因为GDI本身的局限性所造成。
随着Windows2000的推出,上面的情况有了大大的改观:你可以不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序,这一切,全部都依赖于Windows 2000及后继版中所使用的GDI+技术。
首先来看看GDI+的具体技术细节及GDI+编程特点。
Windows2000在用户界面方面包括了几个重大的改进,可能你已经注意到了有阴影的鼠标、渐入的工具条快速提示、透明的窗口、平滑地窗口变化等。
Windows 2000在界面上之所以有这么大的改进,完全是因为Windows2000采用了一种GDI(graphicsdeviceinterface:图形设备接口)。
这种GDI,以前叫GDI2k,现在有了一个更好听的名字:GDI+。
GDI+是一种新型的图形设备接口,它的主要特点在于它能够创建全新的用户桌面体系、能够轻易地完成二维或三维的图形处理,为桌面带来一种数字化的图片。
GDI 同时也提供了增强的图形处理技术,如常见的:alphablending、纹理、贴图、增强的文本及图片显示技术。
实际上,GDI 主要的特色就在于强调通过硬件加速来达到良好的视觉感受!同传统的GDI不同,GDI+中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI+简化了对图像文件的访问(打开、保存)程序:通过调用COM组件来实现的,GDI+扮演的只是指挥者,而非操作员。
对于图像文件,GDI+所关心的不是图像文件的文件头信息,不论欲打开的文件格式是什么类型,GDI+首先要做的是在注册中查看该图像格式的编码(或解码)信息是否已经注册(HKEY_CLASSES_ROOT\MIME\Database\ContentType),如果已经注册,就通过该编码信息调用COM组件,就这么简单。
这种技术其实早就在微软的其他软件中已经使用了,如IE。
“体验”过NIMDA病毒的朋友可能对“audio/wav”这段代码并不陌生,NIMDA就是靠它来伪装自己的:让IE认为附件是WAV文件而自动打开可执行程序。
这其实也是IE使用COM技术的一个突出表现。
配合GDI+的推出,微软也同时发布了相应的SDK,如果你已经安装了最新的MicrosoftPlatFormSDK或已经开始使用,GDI+SDK已经在你的系统中了。
如果没有的话,可以到/progtool上去下载GDI+的头文件和库文件。
在使用GDI 之后,,再有没有必要去考虑什么句柄、设备环境这样的概念了。
你只需要简单地创建一个图形对象(Graphicsobject),然后直接调用该对象的方法(methods)进行绘图即可。
图形对象是GDI+中核心,正如DC之于GDI那样。
图形对象和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别。
一个是基于句柄的GDI,一个是基于组件对象模型的GDI 。
使用GDI+的SDK编程,必须得按照下面的规范来进行:使用GDI+的名空间(namespaceGdiplus)、在使用GDI+函数时必须进行GDI+的初始化,使用完毕之后也得销毁GDI+,这种规范在下面所列的程序中有详细的说明。
前面说到了GDI+是通过在注册中查看编码信息来访问图像文件的,在GDI+的SDK中,编码信息是储存在ImageCodecInfo类中的,在这个类中,有编码的CLSID(COM组件的GUID标识码)、编码方式描述等。
在GDI中,在注册表中访问编码信息通常使用以下两个函数来实现:1、查看系统中可用的图像编码信息(数量及大小)StatusGetImageEncodersSize(UINT*numEncoders,//存储编码器数量的地址UINT*size //存储编码信息所需内存大小);2、得到所有的编码信息StatusGetImageEncoders(UINTnumEncoders,//可用编码器数量UINTsize,//储存编码器信息所需内存(由ImageCodecInfo类组成的数组的大小)ImageCodecInfo*encoders//编码器信息指针);在GetImageEncoders函数中,参数numEncoders和size都是由GetImageEncodersSize所返回的。
下面的代码就能够在注册表中查找具体格式图像的编码方式:intGetImageCLSID(constWCHAR*format,CLSID*pCLSID){//得到格式为format 的图像文件的编码值,访问该格式图像的COM组件的//GUID值保存在pCLSID中UINTnum=0;UINTsize=0;ImageCodecInfo*pImageCodecInfo=NULL;GetImageEncodersSize(&num,&size);if(size==0)returnFALSE;//编码信息不可用//分配内存pImageCodecInfo=(ImageCodecInfo*)(malloc(size));if(pImageCodecInfo==NULL)returnFALSE;//分配失败//获得系统中可用的编码方式的所有信息GetImageEncoders(num,size,pImageCodecInfo);//在可用编码信息中查找format格式是否被支持for(UINTi=0;i<num; i){//MimeType:编码方式的具体描述if(wcscmp(pImageCodecInfo[i].MimeType,format)==0){*pCLSID=pImageCodecInfo[i].Clsid;free(pImageCodecInfo);returnTRUE;} }free(pImageCodecInfo);returnFALSE;}有了这种认识,实现多格式的图像的浏览与转换就并不是什么难事了。
为了讲述的方便,首先在VC中建立一个SDI项目ImageShow,首先对使用GDI+申明和初始化及销毁进行代码编制,具体代码如下:#include"Gdiplus.h"usingnamespaceGdiplus;CImageShowView::CImageShowVi ew(){//初始化GDI+GdiplusStartupInputgdiplusStartupInput;ULONG_PTRgdiplusToken;GdiplusS tartup(&gdiplusToken,&gdiplusStartupInput,NULL);}CImageShowView::~CImageShowView(){//销毁GDI+ULONG_PTRgdiplusToken;GdiplusShutdown(gdiplusToken);}接着通过类向导(ClassWizard),重载“文件”菜单中的“打开”和“另存为”两项,为了编程的简单,本程序只将当前打开的图像文件直接存为BMP文件(实际上保存成其他格式的文件也很简单,只不过是对文件名进行分析而已)。
另外,为了在打开和保存文件进行文件名的传递,首先应在CImageShowView类中加入一全局变量“CStringstrOpenFileName”。
“打开”和“另存为”两项的响应代码如下,大家通过代码中的注释部份理解编程思路,应该不会有什么问题:WCHAR*ToWChar(char*str){//在GDI+中,有关字符的参数类型全部都是WCHAR类型的//该函数是将传统字符串进行转换staticWCHARbuffer[1024];wcsset(buffer,0);MultiByteToWideChar(CP_ACP,0 ,str,strlen(str),buffer,1024);returnbuffer;}voidCImageShowView::OnFileOpen(){//本程序能够打开各类常见格式的图像文件staticcharszFilter[]="常见格式图形文件(*.*)|*.*|";CFileDialogdlgChoseImage(1,NULL,NULL,NULL,szFilter);if(dlgChoseImage.DoModal()==IDOK){strOpenFileName=dlgChoseImage.GetPa thName();//打开文件后立即在窗口中显示(重绘客户窗口)this->Invalidate();}}voidCImageShowView::OnFileSaveAs(){if(strOpenFileName.IsEmpty()){AfxM essageBox("当前没有打开图像文件,不能进行保存!");return;}//建立图形对像Graphicsgraphics(GetDC()->m_hDC);//装入当前已经打开的图形文件Imageimage(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLengt h())));CStringstrFileSave;//当其他格式的图像全部另存为BMP文件staticcharszFilter[]="位图(*.BMP)|*.BMP|";CFileDialogdlgChoseImage(0,"BMP",NULL,NULL,szFilter);if(dlgChoseImage.DoModal()==IDOK){strFileSave=dlgChoseImage.GetPathName();CLSIDclsid;if(GetImageCLSID(L"image/bmp",&clsid)){image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength())),& clsid,NULL);//将保存后的图像进行显示strOpenFileName=strFileSave;this->Invalidate();}}}最后,为了显示浏览图像转换前后的效果,还应该在窗口中分另绘制转换前后的图像,这很容易,只需要在OnDraw函数中添加绘制代码,如下所述:voidCImageShowView::OnDraw(CDC*pDC){CImageShowDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);//如果没有选择显示图形文件,则不用重绘if(strOpenFileName.IsEmpty())return;//显示当前打开的图像文件的全名this->GetParent()->SetWindowText(strOpenFileName);//建立图形对象Graphicsgraphics(pDC->m_hDC);//装入图形文件Imageimage(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLengt h())));PointdestPoints[3]={Point(0,0),Point(image.GetWidth(),0),Point(0,imag e.GetHeight())};Point*pdestPoints=destPoints;//在指定区域pdestPoints显示图像graphics.DrawImage(&image,pdestPoints,3);}在编译上面的程序之前,应该将Gdiplus.lib文件连编到项目中去,否则将会出现“LINK2001”编译错误。