最近在项目中有个需求:区分拍照图片与扫描图片。找不到什么好的方法,目前感觉可行的方式是通过DPI来区分:
一般拍照图片DPI是96甚至更低,扫描图片DPI一般是120、150、200、300等更高。
但是opencv没有获取DPI相关的函数,遍寻百度,觉得还是GDI+实现起来较好。
GDI+的头文件和库,在windows系统中是自带的。
先要引入GDI+的头文件和库
#include "GdiPlus.h"
#pragma comment(lib,"gdiplus.lib")
#define ULONG_PTR ULONG
C++代码实现:
ULONG_PTR m_gdiplus;//为调用GDI+定义的变量
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&m_gdiplus, &gdiplusStartupInput, NULL);
//定义GDI+的状态信息变量,在调试过程查看是否出错
Gdiplus::Status status = Gdiplus::GenericError;
CString sFileName(filename); //filename为图片路径名,char* to CString
Gdiplus::Image imgtemp(sFileName);
status = imgtemp.GetLastStatus();
if (status != Gdiplus::Ok)
cout << "GDI加载图像失败!" << endl;//status= =Gdiplus::Ok说明最近一次GDI+操作是成功的
Gdiplus::REAL x_reso = imgtemp.GetHorizontalResolution();//读取水平方向DP

项目中需要区分拍照和扫描图片,方法是通过图片的DPI判断。拍照图片DPI通常为96或更低,扫描图片DPI较高,如120、150、200、300等。由于OpenCV不提供DPI获取函数,选择使用GDI+,它是Windows系统自带的。GDI+ C++代码实现可以成功获取png/jpg/tif格式图片的DPI,但bmp格式无法获取。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



