今天有个项目需要获取图像DPI信息,搜了几篇博客的描述,最终采用GDI+的方法实现,总结实现方法如下:
0.编程平台:VS2015,语言:C++
1.下载GDI+包,初始化GDI+环境
(1)在工程的App类中增加声明信息,主要包括头文件包含,拷贝库文件gdiplus.lib到工程目录,拷贝动态库文件gdiplus.dll到工程输出文件(一般release或debug目录)。或者在工程中编译器属性中响应的设置库文件和运行文件路径。
#include "GdiPlus.h"
#pragma comment(lib,"gdiplus.lib")
#define ULONG_PTR ULONG
//using namespace Gdiplus;//引用命名空间,我的工程中由于还使用OpenCV,引用命名空间会造成Rect等类型不确定的问题,因此不引用,后续响应的注明GDI+相关函数的命名前缀。
(2)在App类的定义中增加变量定义如下
ULONG_PTR m_gdiplus;//为调用GDI+定义的变量
(3)然后在App类的InitInstance()函数中增加变量的初始化
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&m_gdiplus, &gdiplusStartupInput, NULL);
(4)在App类的ExitInstance()函数中增加变量释放
Gdiplus::GdiplusShutdown(m_gdiplus);
2.读取DPI数据的实现
CFileDialog dlg(TRUE, _T("bmp"), NULL, OFN_FILEMUSTEXIST | OFN_EXPLORER, _T("图像文件(*.bmp;*.jpg;*.png)|*.bmp;*.jpg;*.png|图元文件(*.dxf)|*.dxf|"));
if (dlg.DoModal() == IDOK)
{
CString strFilePath = "";
strFilePath = dlg.GetPathName();
CString strExtName = strFilePath.Right(3);
if (strExtName == "bmp" || strExtName == "jpg" || strExtName == "png")
{
Gdiplus::Status status = Gdiplus::GenericError;//定义GDI+的状态信息变量,在调试过程查看是否出错
Gdiplus::Image imgtemp(strFilePath);
status = imgtemp.GetLastStatus();
if (status != Gdiplus::Ok) AddDebugInfo("GDI加载图像失败!");//status= =Gdiplus::Ok说明最近一次GDI+操作是成功的
Gdiplus::REAL x_reso=imgtemp.GetHorizontalResolution();//读取水平方向DPI信息
if (status != Gdiplus::Ok) AddDebugInfo("GDI读取水平分辨率失败!");
Gdiplus::REAL y_reso = imgtemp.GetVerticalResolution();//读取垂直方向DPI信息,通常两个值是一样的。可以只执行一个操作就好了,返回值数据类型是Gdiplus::REAL,其实就是float型的
if (status != Gdiplus::Ok) AddDebugInfo("GDI读取垂直分辨率失败!");
//CString str = "";
//str.Format(_T("该图像DPI为%4.2f×%4.2f"), x_reso, y_reso);
//AddDebugInfo(str);//这是自定义的用于显示调试信息的函数,可以无视
}
……