基于GDI+的图像格式转换与几何变换研究
2015-03-02陈敏林金表
陈敏++林金表
摘要:在VC++中要实现常用图像格式之间的转换,通常需要掌握每种图像格式的文件头格式、调色板、图像压缩算法等具体细节,实现过程复杂。运用GDI+技术,无需了解每种图像格式的具体含义,即可实现常用图像格式间的转换,并且可以将简单几何转换后的图像保存在任意目录下。
关键词:GDI+;图像格式转换;几何变换
DOIDOI:10.11907/rjdk.143701
中图分类号:TP317.4
文献标识码:A 文章编号文章编号:16727800(2015)001014102
0 引言
图像是人类获取信息的主要途径之一,在研究图像处理过程中,实现常用图像文件格式的相互转换符合现实需求。例如实现常用格式图片BMP与GIF的相互转换,首先需要对BMP和GIF文件格式进行分析,然后才能实现二者之间的读取与显示等相关操作[1]。GDI(Graphics Device Interface:图形设备接口), 是Windows提供给应用程序的编程接口[2]。GDI+是基于类的应用程序编程接口[3]。GDI+是在GDI的基础上发展起来的,增加了许多新功能。
GDI+中引用了对COM(组件对象模型)技术的支持,通过COM技术,开发人员在输出屏幕和打印机信息时无需考虑显示设备的细节,只需要调用GDI+库输出类的一些方法即可完成绘图工作 [4],GDI+简化了图像文件访问程序[5]。随着GDI+的升级,功能也随之变得更加强大,如几何转换、Alpha blending、纹理、贴图、增强的文本及图像显示技术[6]等,极大方便了开发人员在图形、图像领域的开发应用,使图像处理工作变得相对简单。
1 基于GDI+的多种格式图像转换
1.1 GDI+库初始化
在调用GDI+函数之前,需要调用GDI+库的初始化函数GdiplusStartup来初始化GDI+库,GdiplusStartup的原型如下:
Status GdiplusStartup( _out ULONG_PTR token *token,_in const GdiplusStartupInput *input,_out GdiplusStartupOutput *output);
GdiplusStartup (&m_pGdiToken, &m_gdiplusStartupInput, NULL)函数&m_pGdiToken是存储地址,记录了此次使用GDI+的标记;&m_gdiplusStartupInput包含GDI +版本,是指向调试回调函数的指针,以及用于指定是否支持后台线程和外来的图像编码等信息;output是指向GdiplusStartupOutput 类型数据的一个指针,初始化结束时,初始化函数GdiplusStartup在GdiplusStartupOutput类型数据中存放一个事件钩子函数指针和卸载事件钩子函数指针;NULL表示SuppressBackgroundThread的数据成员错误时即为空。
结束后使用GdiplusShutdown()函数关闭GDI+。
1.2 图像显示
(1)查看系统可用编码器信息。用已安装图像编码器的程序段,寻找格式为format的图像编码器类型标识码CLSID,并保存在pCLSID中,成功返回true,否则就返回false。GetImageCLSID得到格式为format的图像文件编码值和访问该格式图像COM组件的GUID值,保存在pCLSID中。在可用编码信息中查找是否支持format格式的编码值,函数原型为:
Int GetImageCLSID(const WCHAR *format, CLSID *pCLSID)
为了得到所有编码器信息、编码器数量、储存编码器信息所需要的内存等,可以调用函数GetImageEncoders()。该函数可让用户知道,在GDI+的情况下哪些图像编译信息是可用的,函数GetImageEncoders的原型是:
Status GetImageEncoders (UINT unmEncoders,UINT size,ImageCodecInfo *encoders);
在GDI+的Image类封装了对BMP、GIF、JPEG、PNG、TIFF、WMF(Windows元文件)和EMF(增强WMF)图像文件的调入、格式转换以及简单处理功能。在Image类从外设转入图像与内存中时需要图像编码器(ImageEncoders)的帮助。图像编码器(ImageEncoders)和图像解码器(ImageDecoders)是与特定的图像格式相联系的,也就是说不同格式的图像有不同的图像编码器和图像解码器。
(2)图像文件读取。在GDI+中显示图像文件转入到内存并显示,首先要创建一个Image对象,然后调用FileOpen()打开各类常用格式的图像文件,szFilter[]="常用图像格式文件(*.*)|*.*|";在MFC ClassWixard中重载OnFileOpen() Static char szFilter[]="位图文件(*.bmp;*.dib)|*.bmp;*.dib|JPG文件(*.jpg)|*.jpg|JPEG文件(*.jpeg)|*.jpeg|GIF文件(*.gif)|*.gif|PNG文件(*.png)|*.png|All Files(*.*)|*.*||";
CfileDialog CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter)
运行上述程序可以打开任意目录下任何常用格式图片。
1.3 图像格式转换
将打开的图像文件保存,定义一个函数StroeBitmap (CString cs)来存储图像旋转后的位图。
BITMAP bitmp;
HBITMAP hbitmap=(HBITMAP)GetCurrentObject(memDC,OBJ_BITMAP);
GetObject(hbitmap,sizeof(bitmp),(void *)&bitmp);
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bi;
打开图像位图文件的存储地址,调用FileSave() 对旋转图像进行保存,可以保存为任意常用格式的图片,可以随时选择保存的图像格式:
Image Image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())));
Cstring strFileSave;
Static char szFilter =” "位图文件(*.bmp;*.dib)|*.bmp;*.dib|JPEG文件(*.jpeg;*.jpg)|*.jpeg;*.jpg|GIF文件(*.gif)|*.gif|PNG文件(*.png)|*.png|All Files(*.*)|*.*||";
CFileDialog dlgChoseImage(0,”BMP”,未命名,NULL,szFilter);
Image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength()) &clsid,NULL);
将转换后的图片存到指定目录,定义图像名称。
2 图像几何转换
GDI+提供函数OnDraw(CDC* pDC),可绘制图形或显示图形,改变图像显示的位置,任意拉伸图像的大小,任意旋转图像,代码如下:
Image
image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())));
Point destPoints[3] =
{
Point(0,0),
Point(800,0),
Point(0, image.GetWidth())
};
Point* pdestPoints = destPoints;
graphics.DrawImage(&image, pdestPoints, 3);
::BitBlt(pDC->m_hDC,0,0,image.GetWidth(),image.GetHeight(),memDC,0,0,SRCCOPY);
::DeleteObject(memBM);
用CreateCompatibleBitmap(API函数)来创建一幅与指定设备环境相关的设备兼容位图。用CreateCompatibleBitmap将旋转后的图像位图保存。
memDC=::CreateCompatibleDC(pDC ->m_hDC);
HBITMAPmemBM=(HBITMAP)::CreateCompatibleBitmap(pDC->m_hDC,image.GetHeight(),image.GetWidth());
::SelectObject(memDC,memBM);
打开原图,将JPG转换成BMP,经过几何变换后,得到如图1所示的效果。
图1 几何变换效果
3 结语
GDI+是一种优秀的图形图像处理技术。本文的程序是在Windows 系统Microsoft Visual Studio 2010下基
于GDI+调试通过的,它能够打开BMP、GIF、JPEG、PNG、TIFF,WMF和EMF等任意常用格式图像,可以任意几何变换显示和保存,如旋转、拉伸、缩放等;可以转换成任意常用图像格式,并保存在任意目录下。
参考文献:
[1] 韩娇.基于VC++的BMP格式图像与GIF格式图像的相互转换[J].武汉理工大学学报,2007,12(29):2325.
[2] 李睿敏,陈俐坊.基于GDI+技术图形图像处理[J].纺织机械,2013(4):3033.
[3] 周鸣扬,曾洁玫. GDI+程序设计实例[M].北京:中国水利水电出版社,2004.
[4] 刘涛. 基于Visual C++6.0的GDI+图像编程[J].中文信息,2003(11):8789.
[5] 刘海砚,安晓亚. 基于GDI+的图像快速处理[C]//北京:中国地理信息系统协会第四次会员代表大会暨第十一届年会论文集,2007:204209.
[6] 刘燕丽.GDI+在图形学教学的研究与应用[J].软件导报,2011,4(10):111120.