463 lines
18 KiB
C
463 lines
18 KiB
C
#ifndef WRRPER_SANE_SCANNER_H
|
||
#define WRRPER_SANE_SCANNER_H
|
||
|
||
/*********************************************************************************************
|
||
*时间:2021年2月5日 *
|
||
*说明: *
|
||
* 此模块为将C++设备通信层以及图像处理层代码进行封装,封装为C 接口的代码,以整合 *
|
||
*SANE*到SANE接口中; *
|
||
*一下做以调用流程说明: *
|
||
* GetInstance() 创建此模块对象 *
|
||
* ↓↓ *
|
||
* Open() 打开USB端口 *
|
||
* ↓↓ *
|
||
* Start() 开始扫描 *
|
||
* ↓↓ *
|
||
* Get_Image_Info() 获取图像队列最前端图像信息,申请内存pdata *
|
||
* ↑ → → → ↓ *
|
||
* ↑Get_ProcedImgQueueEmpty() ↓当已处理图像队列不为空的时候循环此流程 *
|
||
* ↑ ↓ 取图 *
|
||
* ↑ ← ← ← ↓ *
|
||
* AquireImage(pdata) 传图图像指针,获取图像数据 *
|
||
* ↓↓ *
|
||
* ReleaseInstance() 删除释放相关资源,此处不用调用Close()接口,内部已做处理 *
|
||
* *
|
||
**********************************************************************************************/
|
||
|
||
typedef void* HG_Scanner_Handle;
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
//#ifdef WIN32
|
||
// #ifdef DLL_HG_SCHANNER_EXPORTS
|
||
// #define DLL_HG_SCHANNER_API extern "C" _declspec(dllexport)
|
||
// #else
|
||
// #define DLL_HG_SCHANNER_API extern "C" _declspec(dllimport)
|
||
// #endif
|
||
//#else
|
||
// #define DLL_HG_SCHANNER_API
|
||
//#endif
|
||
#ifdef __linux__
|
||
#define DLL_HG_SCHANNER_API
|
||
#else
|
||
#define DLL_HG_SCHANNER_API extern "C" _declspec(dllexport)
|
||
#endif
|
||
|
||
/* 幅面枚举类型 */
|
||
|
||
typedef enum
|
||
{
|
||
HG_None = 0,
|
||
HG_A4Letter = 1,
|
||
HG_A4 = 1,
|
||
HG_B5Letter = 2,
|
||
HG_JISB5 = 2,
|
||
HG_B5 = 2,
|
||
HG_USLetter = 3,
|
||
HG_USLegal = 4,
|
||
HG_A5 = 5,
|
||
HG_B4 = 6,
|
||
HG_ISOB4 = 6,
|
||
HG_B6 = 7,
|
||
HG_ISOB6 = 7,
|
||
HG_USLedger = 9,
|
||
HG_USExecutive = 10,
|
||
HG_A3 = 11,
|
||
HG_B3 = 12,
|
||
HG_ISOB3 = 12,
|
||
HG_A6 = 13,
|
||
HG_C4 = 14,
|
||
HG_C5 = 15,
|
||
HG_C6 = 16,
|
||
HG__4A0 = 17,
|
||
HG__2A0 = 18,
|
||
HG_A0 = 19,
|
||
HG_A1 = 20,
|
||
HG_A2 = 21,
|
||
HG_A7 = 22,
|
||
HG_A8 = 23,
|
||
HG_A9 = 24,
|
||
HG_A10 = 25,
|
||
HG_ISOB0 = 26,
|
||
HG_ISOB1 = 27,
|
||
HG_ISOB2 = 28,
|
||
HG_ISOB5 = 29,
|
||
HG_ISOB7 = 30,
|
||
HG_ISOB8 = 31,
|
||
HG_ISOB9 = 32,
|
||
HG_ISOB10 = 33,
|
||
HG_JISB0 = 34,
|
||
HG_JISB1 = 35,
|
||
HG_JISB2 = 36,
|
||
HG_JISB3 = 37,
|
||
HG_JISB4 = 38,
|
||
HG_JISB6 = 39,
|
||
HG_JISB7 = 40,
|
||
HG_JISB8 = 41,
|
||
HG_JISB9 = 42,
|
||
HG_JISB10 = 43,
|
||
HG_C0 = 44,
|
||
HG_C1 = 45,
|
||
HG_C2 = 46,
|
||
HG_C3 = 47,
|
||
HG_C7 = 48,
|
||
HG_C8 = 49,
|
||
HG_C9 = 50,
|
||
HG_C10 = 51,
|
||
HG_USStatement = 52,
|
||
HG_MaxSize = 54
|
||
}HG_PAPERTYPE;
|
||
|
||
/* 除色类型 */
|
||
typedef enum hg_tagFilter
|
||
{
|
||
HG_FILTER_RED, /* 除红色 */
|
||
HG_FILTER_GREEN, /* 除绿色 */
|
||
HG_FILTER_BLUE, /* 除蓝色 */
|
||
HG_FILTER_NONE, /* 无除色 */
|
||
HG_FILTER_ALL, /* 全除色 */
|
||
HG_ENHANCE_RED, /* 红色增强 */
|
||
HG_ENHANCE_GREEN, /* 绿色增强 */
|
||
HG_ENHANCE_BLUE /* 蓝色增强 */
|
||
}HG_FILTER;
|
||
|
||
/* 扫描色彩 */
|
||
typedef enum
|
||
{
|
||
HG_BlackWhite, /* 黑白 */
|
||
HG_Gray, /* 灰度 */
|
||
HG_RGB /* 彩色 */
|
||
}HG_COLORMODE;
|
||
|
||
/* 多流输出类型 */
|
||
typedef enum {
|
||
HG_Unused = -1, /* 无 */
|
||
HG_All, /* 彩色+灰度+黑白 */
|
||
HG_ColorGray, /* 彩色+灰度 */
|
||
HG_ColorBw, /* 彩色+黑白 */
|
||
HG_GrayBw /* 灰度+黑白 */
|
||
}HG_MULTIOUTPUT;
|
||
|
||
/* 页面方向 */
|
||
typedef enum {
|
||
HG_Rot0 = 0, /* 纵向 */
|
||
HG_Rot270 = 3 /* 横向 */
|
||
}HG_PAPERALIGN;
|
||
|
||
/* 滤镜类型 */
|
||
typedef enum
|
||
{
|
||
HG_STNone, /* 无滤镜 */
|
||
HG_Sharpen, /* 锐化 */
|
||
HG_SharpenMore, /* 锐化加强 */
|
||
HG_Blur, /* 模糊 */
|
||
HG_BlurMore /* 模糊加强 */
|
||
}HG_SHARPENTYPE;
|
||
|
||
/* 旋转类型 */
|
||
typedef enum
|
||
{
|
||
HG_ROTATE_NONE = 0, /* 无旋转 */
|
||
HG_ROTATE_90, /* 旋转逆时针90度 */
|
||
HG_ROTATE_180, /* 旋转180度 */
|
||
HG_ROTATE_270, /* 旋转顺时针90度 */
|
||
HG_AUTOTEXT_DETECT /* 文稿方向识别 */
|
||
}HG_ORENTATION;
|
||
|
||
/* 设备状态 */
|
||
typedef enum
|
||
{
|
||
HG_STATUS_SCANNING = 1, /* 正在扫描 */
|
||
HG_STATUS_SCANSTOP, /* 扫描停止 */
|
||
HG_STATUS_NO_FEED, /* 无纸 */
|
||
HG_STATUS_COVEROPEN, /* 开盖 */
|
||
HG_STATUS_FEED_IN_ERROR, /* 馈纸错误 */
|
||
HG_STATUS_PAPER_JAM, /* 卡纸 */
|
||
HG_STATUS_DETECT_STAPLE, /* 订书钉 */
|
||
HG_STATUS_DETECT_DOUBLE_FEED, /* 双张 */
|
||
HG_STATUS_DETECT_SIZECHECKERROR, /* 尺寸检测错误 */
|
||
HG_STATUS_PAPER_SKEW, /* 纸张歪斜 */
|
||
HG_STATUS_USBCONNECT, /* 设备已连接 */
|
||
HG_STATUS_USBDISCONNECT, /* 设备未连接 */
|
||
HG_STATUS_USBERROR, /* USB错误 */
|
||
HG_STATUS_TIMEOUT, /* 取图超时 */
|
||
HG_STATUS_DOGEAR, /* 检查到折角 */
|
||
HG_STATUS_AQULRE_ERROR, /* 扫描仪取图错误 */
|
||
HG_STATUS_COUNTMODE, /* 计数模式 */
|
||
HG_STATUS_SLEEP, /* 设备休眠中 */
|
||
|
||
}HG_STATUSCODE;
|
||
|
||
/*缓存文件格式*/
|
||
typedef enum {
|
||
HG_CJPG,
|
||
HG_CPNG,
|
||
HG_CBMP,
|
||
HG_CTIFF
|
||
}HG_CACHEIMGFORMAT;
|
||
|
||
/* 扫描图像保存模式 */
|
||
typedef enum
|
||
{
|
||
HG_XFERMEMORY, /* 内存保存图像信息 */
|
||
HG_XFERFILE /* 图像文件保存图像信息 */
|
||
}HG_TRANSFERMODE;
|
||
|
||
/* 除穿孔参数 */
|
||
typedef struct
|
||
{
|
||
int enable; /* 使能:开启该功能为true;关闭该功能为false */
|
||
int ratio; /* 穿孔搜索范围(从边缘到页面中心比例):1~50,对应1%~50% */
|
||
}HG_FILLHOLE;
|
||
|
||
/* 硬件参数 */
|
||
typedef struct
|
||
{
|
||
int capturepixtype; /* 颜色模式 */
|
||
int doubleFeedDetection; /* 双张检测 */
|
||
int bindingDetection; /* 订书钉检测 */
|
||
}HG_HARDWARECAPS;
|
||
|
||
/* 跳过空白页(与对折功能互斥) */
|
||
typedef struct
|
||
{
|
||
int Duplex; /* 1: both ; 0: front */
|
||
int DiscardBlank; /* 跳过空白页通用 0:disable 1: enbale */
|
||
int DiscardBlankVince; /* 跳过空白页(发票)0:disable 1: enbale */
|
||
int Fold; /* 对折 0:disable 1: enbale */
|
||
int SwitchFrontBack; /* 互换正反面 0:disable 1: enbale */
|
||
}HG_SCANSIDE;
|
||
|
||
/* 图像数据 */
|
||
typedef struct
|
||
{
|
||
unsigned int width; /* 像素宽度 */
|
||
unsigned int height; /* 像素高度 */
|
||
unsigned int bitdepth; /* 位深 */
|
||
unsigned char* pimgdata; /* 数据指针 */
|
||
unsigned int bytesperline; /* 每行数据长度 */
|
||
unsigned int bufferlength; /* 数据总长度 */
|
||
}HG_IMG;
|
||
|
||
/* 图像处理 */
|
||
typedef struct
|
||
{
|
||
int AutoCrop; /* 自动裁剪尺寸 */
|
||
int Brightness; /* 1~255 */
|
||
int Contrast; /* 1~7 */
|
||
float Gamma; /* 0.1f~5.0f */
|
||
int FillBlackRect; /* 消除黑框 */
|
||
int AutoDescrew; /* 自动纠偏 */
|
||
int RefuseInflow; /* 防止渗透 */
|
||
HG_FILLHOLE FillHole; /* 填穿孔参数 */
|
||
HG_FILTER Filter; /* 除色与颜色增强 */
|
||
int ColorCorrection; /* 色彩校正 */
|
||
int RemoveMorr; /* 去除摩尔纹 */
|
||
int ErrorExtention; /* 错误扩散 */
|
||
int NosieDetach; /* 噪点优化 */
|
||
int NosieDetachEnable;
|
||
int TextureRemove; /* 除网纹 */
|
||
int Indent; /* 边缘缩进像素 */
|
||
int Noise; /* 降噪像素点 */
|
||
int AutoCrop_threshold; /* 自动裁剪二值化阀值 */
|
||
bool Is_convex; /* 填充黑框方式 */
|
||
HG_SHARPENTYPE SharpenType; /* 滤镜类型 */
|
||
int MultiOutFilterRed; /* 多流输出除红 */
|
||
int AnswerSheetFilterRed; /* 答题卡除红 */
|
||
HG_ORENTATION Orentation; /* 图像旋转 */
|
||
int BackRotate180; /* 背面旋转180 */
|
||
int SplitImage; /* 图像拆分 */
|
||
int DiscardBlankThre; /* 跳过空白页阈值*/
|
||
}HG_IMAGEPROCESS;
|
||
|
||
/* 扫描参数 */
|
||
typedef struct
|
||
{
|
||
HG_COLORMODE PixelType; /* 色彩:彩色/灰度/黑白 */
|
||
HG_MULTIOUTPUT MultiOutput; /* 多流输出:彩色+灰度+黑白 */
|
||
HG_PAPERTYPE PaperSize; /* 幅面 */
|
||
HG_PAPERALIGN PaperAlign; /* 文档方向 */
|
||
HG_CACHEIMGFORMAT CacheFormat; /* 缓存图像格式*/
|
||
int Resolution; /* 分辨率:100/150/200/300/600 */
|
||
HG_SCANSIDE ScanSide; /* 正反面:正面/正反双面 */
|
||
HG_IMAGEPROCESS ImageProcess; /* 图像处理 */
|
||
HG_HARDWARECAPS HardwareParam; /* 硬件参数 */
|
||
}HG_SCANPARAMS;
|
||
|
||
/// <summary>
|
||
/// 获取图像回调函数
|
||
/// </summary>
|
||
/// <param name="img">[in]图像数据结构体</param>
|
||
typedef void(*HG_OnImage_Callback)(HG_IMG* img, void* obj);
|
||
|
||
/// <summary>
|
||
/// 设备状态变更回调函数
|
||
/// </summary>
|
||
/// <param name="statuscode">[in]设备状态</param>
|
||
typedef void(*HG_OnDevice_Event_Callback)(HG_STATUSCODE statuscode, void* obj);
|
||
|
||
/// <summary>
|
||
/// 初始化设备。该功能在整个扫描流程最开始调用,且仅需调用一次
|
||
/// </summary>
|
||
DLL_HG_SCHANNER_API void HG_Init();
|
||
|
||
/// <summary>
|
||
/// 设置图像格式 .png .jpg
|
||
/// </summary>
|
||
DLL_HG_SCHANNER_API void HG_ImgSaveType(const char* img_type);
|
||
|
||
/// <summary>
|
||
/// 获取当前电脑连接的华高扫描仪设备列表
|
||
/// </summary>
|
||
/// <param name="strSeperator">[in]分隔符</param>
|
||
/// <returns>成功返回以 szSeperator 分隔的设备列表; 无设备返回 NULL。</returns>
|
||
DLL_HG_SCHANNER_API char* HG_GetDevices(char* strSeperator);
|
||
|
||
/// <summary>
|
||
/// 打开PC端 USB端口并激活
|
||
/// </summary>
|
||
/// <param name="scannername">[in]设备名称。可通过HG_GetDevices获得</param>
|
||
/// <returns>成功返回设备句柄;失败返回NULL</returns>
|
||
DLL_HG_SCHANNER_API HG_Scanner_Handle HG_OpenScanner(char* scannername);
|
||
|
||
/// <summary>
|
||
/// 关闭USB端口
|
||
/// </summary>
|
||
/// <param name="pScanner">[in]设备句柄</param>
|
||
DLL_HG_SCHANNER_API void HG_CloseScanner(HG_Scanner_Handle pScanner);
|
||
|
||
/// <summary>
|
||
/// 获取扫描参数
|
||
/// </summary>
|
||
/// <param name="pScanner">[in]设备句柄</param>
|
||
/// <param name="param">[out]扫描参数指针</param>
|
||
/// <returns>成功返回0;失败返回非0</returns>
|
||
DLL_HG_SCHANNER_API int HG_Get_Scan_Params(HG_Scanner_Handle pScanner, HG_SCANPARAMS* param);
|
||
|
||
/// <summary>
|
||
/// 配置扫描参数
|
||
/// </summary>
|
||
/// <param name="pScanner">[in]设备句柄</param>
|
||
/// <param name="param">[in]扫描参数</param>
|
||
/// <returns>成功返回0;失败返回非0</returns>
|
||
DLL_HG_SCHANNER_API int HG_Set_Scan_Params(HG_Scanner_Handle pScanner, HG_SCANPARAMS param);
|
||
|
||
/// <summary>
|
||
/// 开始扫描
|
||
/// </summary>
|
||
/// <param name="pScanner">[in]设备句柄</param>
|
||
/// <param name="count">[in]扫描张数。-1位连续扫描;≥1为指定页数扫描</param>
|
||
/// <returns>成功返回0;失败返回非0</returns>
|
||
DLL_HG_SCHANNER_API int HG_StartScan(HG_Scanner_Handle pScanner, int count);
|
||
|
||
/// <summary>
|
||
/// 停止扫描
|
||
/// </summary>
|
||
/// <param name="pScanner">[in]设备句柄</param>
|
||
/// <returns>成功返回0;失败返回非0</returns>
|
||
DLL_HG_SCHANNER_API int HG_StopScan(HG_Scanner_Handle pScanner);
|
||
|
||
/// <summary>
|
||
/// 获取扫描仪扫描状态
|
||
/// </summary>
|
||
/// <param name="pScanner">[in]设备句柄</param>
|
||
/// <returns>正在扫描返回非零;反之返回0</returns>
|
||
DLL_HG_SCHANNER_API int HG_Is_Running(HG_Scanner_Handle pScanner);
|
||
|
||
/// <summary>
|
||
/// 检测纸槽是否有纸
|
||
/// </summary>
|
||
/// <param name="pScanner">[in]设备句柄</param>
|
||
/// <returns>返回0为无纸;返回1为有纸;返回-1为异常</returns>
|
||
DLL_HG_SCHANNER_API int HG_Is_FeederLoaded(HG_Scanner_Handle pScanner);
|
||
|
||
/// <summary>
|
||
/// 注册获取图像回调接口
|
||
/// </summary>
|
||
/// <param name="onimg_callback">[in]图像获取回调函数指针</param>
|
||
DLL_HG_SCHANNER_API void HG_Set_AquireImg_callback(HG_OnImage_Callback onimg_callback, void* obj = nullptr);
|
||
|
||
/// <summary>
|
||
/// 注册获取设备状态变更回调接口
|
||
/// </summary>
|
||
/// <param name="onevent_callback">[in]设备状态变更回调函数指针</param>
|
||
DLL_HG_SCHANNER_API void HG_Set_OnDeviceEvent_callback(HG_OnDevice_Event_Callback onevent_callback, void* obj = nullptr);
|
||
|
||
/// <summary>
|
||
/// 创建多页文档。包括PDF和OFD两种格式
|
||
/// </summary>
|
||
/// <param name="srcFiles">[in]图片名称</param>
|
||
/// <param name="srcNum">[in]srcFiles包含图片名称数量</param>
|
||
/// <param name="dstFile">[in]合成文档名称。根据 后缀名判定合成格式</param>
|
||
/// <returns>成功返回0;失败返回非0</returns>
|
||
DLL_HG_SCHANNER_API int HG_Create_MultiPageDocument(char** srcFiles, int srcNum, char* dstFile);
|
||
|
||
/// <summary>
|
||
/// 创建多页tiff。
|
||
/// </summary>
|
||
/// <param name="srcFiles">[in]图片名称</param>
|
||
/// <param name="srcNum">[in]srcFiles包含图片名称数量</param>
|
||
/// <param name="dstFile">[in]合成tiff名称。根据 后缀名判定合成格式</param>
|
||
/// <returns>成功返回0;失败返回非0</returns>
|
||
DLL_HG_SCHANNER_API int HG_Create_MultiTiff(char** srcFiles, int srcnum, char* dstFile);
|
||
|
||
/// <summary>
|
||
/// 获取SDK版本信息
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
DLL_HG_SCHANNER_API char* HG_GetSDKVersion();
|
||
|
||
/// <summary>
|
||
/// 获取序列号
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
DLL_HG_SCHANNER_API const char* HG_GetSerialNum(HG_Scanner_Handle pScanner);
|
||
|
||
/// <summary>
|
||
/// 获取固件版本号
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
DLL_HG_SCHANNER_API const char* HG_GetFwVersion(HG_Scanner_Handle pScanner);
|
||
|
||
/// <summary>
|
||
/// 获取扫描仪是否在睡眠模式当中
|
||
/// </summary>
|
||
/// <returns>-1:设备未初始化 0:设备已唤醒 1:唤醒失败</returns>
|
||
DLL_HG_SCHANNER_API int HG_GET_IS_SLEEP_STATUS(HG_Scanner_Handle pScanner);
|
||
|
||
/// <summary>
|
||
/// 重启设备 重启设备后usb io会被释放所以需要从新进行初始化
|
||
/// </summary>
|
||
/// <returns>-1:非正常;1:重启设备</returns>
|
||
DLL_HG_SCHANNER_API int HG_REBOOT_DEVICE(HG_Scanner_Handle pScanner);
|
||
|
||
/// <summary>
|
||
/// 根据 HG_ImgSaveType 设置图像压缩率(默认JPG)
|
||
/// 设置图像压缩率JPG (默认80) 格式:1-100 值越小压缩比例越高,图像质量越低。
|
||
/// 设置图像压缩率PNG (默认30) 格式:10的整数倍10 20 30....100 值越大压缩比例越低,图像质量越高。
|
||
/// C#调用时 使用bitmap 请自行压缩
|
||
/// </summary>
|
||
/// <returns>NULL</returns>
|
||
DLL_HG_SCHANNER_API void HG_SET_IMG_COMPRESSION(unsigned int compressiondata);
|
||
/// <summary>
|
||
/// 画质优先,速度优先
|
||
/// 画质优先:保持高清的图像,损失出图速度。速度优先反之
|
||
/// compressiondata default:true--->画质优先 ,false 速度优先
|
||
/// </summary>
|
||
/// <returns>成功:true 失败:false</returns>
|
||
DLL_HG_SCHANNER_API bool HG_Set_Img_Quality(HG_Scanner_Handle pScanner, bool compressiondata = true);
|
||
/// <summary>
|
||
/// 转换tiff G4无压缩图像 支持24位图和8位图 注意:此方法会随损失出图的效率
|
||
/// m_tmppath:图像路径
|
||
/// </summary>
|
||
/// <returns>成功:true 失败:false</returns>
|
||
DLL_HG_SCHANNER_API bool G4TiffSave(char* m_tmppath);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif
|