From c12087da6c1ab01d92cd7185e0f9355ec69a78b6 Mon Sep 17 00:00:00 2001
From: zkh <1650697374@qq.com>
Date: Wed, 12 Nov 2025 11:34:11 +0800
Subject: [PATCH] =?UTF-8?q?feat(scanner):=20=E5=88=9D=E5=A7=8B=E5=8C=96?=
=?UTF-8?q?=E6=89=AB=E6=8F=8F=E4=BB=AASDK=E5=9F=BA=E7=A1=80=E7=B1=BB?=
=?UTF-8?q?=E5=9E=8B=E5=92=8C=E5=B8=B8=E9=87=8F=E5=AE=9A=E4=B9=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 添加.gitignore文件,排除编译输出和IDE配置文件
- 定义HGDef.h头文件,包含平台相关类型和宏定义
- 创建HGDef.java接口,映射C语言类型到Java JNA类型
- 添加HGScannerConstants.java,定义扫描仪相关常量
- 创建HGScannerLib.h头文件,声明扫描仪库接口和常量
---
.gitignore | 47 ++
pom.xml | 306 +++++++
src/main/java/vip/jcfd/sdk/HGDef.java | 200 +++++
.../java/vip/jcfd/sdk/HGScannerConstants.java | 205 +++++
src/main/java/vip/jcfd/sdk/HGScannerLib.java | 354 +++++++++
.../java/vip/jcfd/sdk/HGScannerWrapper.java | 387 +++++++++
src/main/resources/c/HGDef.h | 165 ++++
src/main/resources/c/HGScannerLib.h | 745 ++++++++++++++++++
8 files changed, 2409 insertions(+)
create mode 100644 .gitignore
create mode 100644 pom.xml
create mode 100644 src/main/java/vip/jcfd/sdk/HGDef.java
create mode 100644 src/main/java/vip/jcfd/sdk/HGScannerConstants.java
create mode 100644 src/main/java/vip/jcfd/sdk/HGScannerLib.java
create mode 100644 src/main/java/vip/jcfd/sdk/HGScannerWrapper.java
create mode 100644 src/main/resources/c/HGDef.h
create mode 100644 src/main/resources/c/HGScannerLib.h
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7d4753d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,47 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+.kotlin
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
+
+.claude
+
+.idea
+
+settings.xml.example
+
+DEPLOY.md
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..a076d9c
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,306 @@
+
+
+ 4.0.0
+
+
+ vip.jcfd
+ HuaGoScanner-SDK
+ 1.0.0
+ jar
+
+
+ HuaGoScanner-SDK
+ HuaGo Scanner SDK for Java
+ https://github.com/yourusername/HuaGoScanner-SDK
+
+
+
+
+ developer-id
+ zkh
+ 1650697374@qq.com
+
+ developer
+ maintainer
+
+
+
+
+
+
+
+ Apache License, Version 2.0
+ https://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+ A business-friendly OSS license
+
+
+
+
+
+ scm:git:git://github.com/yourusername/HuaGoScanner-SDK.git
+ scm:git:ssh://github.com:yourusername/HuaGoScanner-SDK.git
+ https://github.com/yourusername/HuaGoScanner-SDK/tree/main
+
+
+
+ 11
+ 11
+ UTF-8
+
+
+
+
+ net.java.dev.jna
+ jna
+ 5.17.0
+
+
+
+ net.java.dev.jna
+ jna-platform
+ 5.17.0
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 3.6.0
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.11.0
+
+ 11
+ 11
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.3.0
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.5.0
+
+ none
+ 11
+ UTF-8
+ UTF-8
+ UTF-8
+
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ 3.1.0
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+ ${env.GPG_PASSPHRASE}
+
+ false
+
+
+
+
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+ 1.6.13
+ true
+
+ ossrh
+ https://oss.sonatype.org/
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ 3.0.1
+
+ v@{project.version}
+ true
+ false
+ release
+ deploy
+
+
+
+
+
+
+
+
+
+
+
+
+ ossrh
+ https://oss.sonatype.org/content/repositories/snapshots
+
+
+ ossrh
+ https://oss.sonatype.org/service/local/staging/deploy/maven2/
+
+
+
+
+
+
+ release
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.3.0
+
+
+ attach-sources
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.5.0
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ 3.1.0
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/vip/jcfd/sdk/HGDef.java b/src/main/java/vip/jcfd/sdk/HGDef.java
new file mode 100644
index 0000000..c01da36
--- /dev/null
+++ b/src/main/java/vip/jcfd/sdk/HGDef.java
@@ -0,0 +1,200 @@
+package vip.jcfd.sdk;
+
+import com.sun.jna.IntegerType;
+import com.sun.jna.Native;
+import com.sun.jna.Pointer;
+import com.sun.jna.Structure;
+import com.sun.jna.win32.StdCallLibrary;
+import com.sun.jna.win32.W32APIOptions;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * JNA接口映射 - 基于HGDef.h头文件
+ */
+public interface HGDef extends StdCallLibrary {
+
+ // 基本类型映射
+ class HGVoid {}
+ class HGChar extends IntegerType {
+ public HGChar() { super(1, true); }
+ public HGChar(long value) { super(1, value, true); }
+ }
+ class HGByte extends IntegerType {
+ public HGByte() { super(1, false); }
+ public HGByte(long value) { super(1, value, false); }
+ }
+ class HGShort extends IntegerType {
+ public HGShort() { super(2, true); }
+ public HGShort(long value) { super(2, value, true); }
+ }
+ class HGUShort extends IntegerType {
+ public HGUShort() { super(2, false); }
+ public HGUShort(long value) { super(2, value, false); }
+ }
+ class HGInt extends IntegerType {
+ public HGInt() { super(4, true); }
+ public HGInt(long value) { super(4, value, true); }
+ }
+ class HGUInt extends IntegerType {
+ public HGUInt() { super(4, false); }
+ public HGUInt(long value) { super(4, value, false); }
+ }
+ class HGLonglong extends IntegerType {
+ public HGLonglong() { super(8, true); }
+ public HGLonglong(long value) { super(8, value, true); }
+ }
+ class HGULonglong extends IntegerType {
+ public HGULonglong() { super(8, false); }
+ public HGULonglong(long value) { super(8, value, false); }
+ }
+ class HGBool extends IntegerType {
+ public HGBool() { super(4, true); }
+ public HGBool(long value) { super(4, value, true); }
+ }
+ class HGFloat extends IntegerType {
+ public HGFloat() { super(4, true); }
+ public HGFloat(long value) { super(4, value, true); }
+ }
+ class HGDouble extends IntegerType {
+ public HGDouble() { super(8, true); }
+ public HGDouble(long value) { super(8, value, true); }
+ }
+
+ // 平台相关类型映射
+ boolean IS_64BIT = Native.LONG_SIZE == 8;
+
+ // HGSize 和 HGUSize 根据平台映射
+ class HGSize extends IntegerType {
+ public HGSize() { super(IS_64BIT ? 8 : 4, true); }
+ public HGSize(long value) { super(IS_64BIT ? 8 : 4, value, true); }
+ }
+
+ class HGUSize extends IntegerType {
+ public HGUSize() { super(IS_64BIT ? 8 : 4, false); }
+ public HGUSize(long value) { super(IS_64BIT ? 8 : 4, value, false); }
+ }
+
+ class HGColor extends IntegerType {
+ public HGColor() { super(4, false); }
+ public HGColor(long value) { super(4, value, false); }
+ }
+
+ class HGResult extends IntegerType {
+ public HGResult() { super(4, false); }
+ public HGResult(long value) { super(4, value, false); }
+ }
+
+ // 常量定义
+ int HGTRUE = 1;
+ int HGFALSE = 0;
+
+ // Windows特定类型
+ class HGWindow extends Pointer {
+ public HGWindow() { super(0); }
+ public HGWindow(long peer) { super(peer); }
+ }
+
+ // 结构体定义 - 使用4字节对齐
+ @Structure.FieldOrder({"left", "top", "right", "bottom"})
+ class HGRect extends Structure {
+ public int left;
+ public int top;
+ public int right;
+ public int bottom;
+
+ public HGRect() {}
+ public HGRect(int left, int top, int right, int bottom) {
+ this.left = left;
+ this.top = top;
+ this.right = right;
+ this.bottom = bottom;
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("left", "top", "right", "bottom");
+ }
+ }
+
+ @Structure.FieldOrder({"left", "top", "right", "bottom"})
+ class HGRectF extends Structure {
+ public float left;
+ public float top;
+ public float right;
+ public float bottom;
+
+ public HGRectF() {}
+ public HGRectF(float left, float top, float right, float bottom) {
+ this.left = left;
+ this.top = top;
+ this.right = right;
+ this.bottom = bottom;
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("left", "top", "right", "bottom");
+ }
+ }
+
+ @Structure.FieldOrder({"x", "y"})
+ class HGPoint extends Structure {
+ public int x;
+ public int y;
+
+ public HGPoint() {}
+ public HGPoint(int x, int y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("x", "y");
+ }
+ }
+
+ @Structure.FieldOrder({"x", "y"})
+ class HGPointF extends Structure {
+ public float x;
+ public float y;
+
+ public HGPointF() {}
+ public HGPointF(float x, float y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("x", "y");
+ }
+ }
+
+ // 颜色处理方法
+ static int HG_MAKECOLOR(int r, int g, int b, int a) {
+ return ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((g & 0xFF) << 8) | (r & 0xFF);
+ }
+
+ static int HG_GETCOLOR_R(int color) {
+ return color & 0xFF;
+ }
+
+ static int HG_GETCOLOR_G(int color) {
+ return (color >> 8) & 0xFF;
+ }
+
+ static int HG_GETCOLOR_B(int color) {
+ return (color >> 16) & 0xFF;
+ }
+
+ static int HG_GETCOLOR_A(int color) {
+ return (color >> 24) & 0xFF;
+ }
+
+ // 路径分隔符
+ char HG_SEP_CHAR = System.getProperty("os.name").toLowerCase().contains("win") ? '\\' : '/';
+ String HG_SEP_STRING = System.getProperty("os.name").toLowerCase().contains("win") ? "\\" : "/";
+}
diff --git a/src/main/java/vip/jcfd/sdk/HGScannerConstants.java b/src/main/java/vip/jcfd/sdk/HGScannerConstants.java
new file mode 100644
index 0000000..58d5cd3
--- /dev/null
+++ b/src/main/java/vip/jcfd/sdk/HGScannerConstants.java
@@ -0,0 +1,205 @@
+package vip.jcfd.sdk;
+
+/**
+ * 扫描仪常量定义
+ * 基于HGScannerLib.h中的常量定义
+ */
+public class HGScannerConstants {
+
+ // ==================== 设备错误码常量 ====================
+
+ // 1:软件逻辑错误
+ public static final int HGLIB_DEV_OPERATECODE_INVALID_PARAMETER = 0x100;
+ public static final int HGLIB_DEV_OPERATECODE_ERR_USER_CANCELED = 0x101;
+ public static final int HGLIB_DEV_OPERATECODE_INSUFFICIENT_MEMORY = 0x102;
+ public static final int HGLIB_DEV_OPERATECODE_ACCESS_DENIED = 0x103;
+ public static final int HGLIB_DEV_OPERATECODE_IO_PENDING = 0x104;
+ public static final int HGLIB_DEV_OPERATECODE_ERR_NOT_EXACT = 0x105;
+ public static final int HGLIB_DEV_OPERATECODE_ERR_CONFIGURATION_CHANGED = 0x106;
+ public static final int HGLIB_DEV_OPERATECODE_ERR_NOT_OPEN = 0x107;
+ public static final int HGLIB_DEV_OPERATECODE_ERR_NOT_START = 0x108;
+ public static final int HGLIB_DEV_OPERATECODE_ERR_NOT_ANY_MORE = 0x109;
+ public static final int HGLIB_DEV_OPERATECODE_ERR_NO_DATA = 0x10A;
+ public static final int HGLIB_DEV_OPERATECODE_HAS_DATA_YET = 0x10B;
+ public static final int HGLIB_DEV_OPERATECODE_OUT_OF_RANGE = 0x10C;
+ public static final int HGLIB_DEV_OPERATECODE_IO = 0x10D;
+ public static final int HGLIB_DEV_OPERATECODE_TIMEOUT = 0x10E;
+ public static final int HGLIB_DEV_OPERATECODE_OPEN_FILE_FAILED = 0x10F;
+ public static final int HGLIB_DEV_OPERATECODE_CREATE_FILE_FAILED = 0x110;
+ public static final int HGLIB_DEV_OPERATECODE_WRITE_FILE_FAILED = 0x111;
+ public static final int HGLIB_DEV_OPERATECODE_DATA_DAMAGED = 0x112;
+ public static final int HGLIB_DEV_OPERATECODE_OPENED_BY_OTHER_PROCESS = 0x113;
+ public static final int HGLIB_DEV_OPERATECODE_LANG_PAK_LOST = 0x114;
+ public static final int HGLIB_DEV_OPERATECODE_RELOAD_IMAGE_PARAM = 0x115;
+ public static final int HGLIB_DEV_OPERATECODE_RELOAD_OPT_PARAM = 0x116;
+ public static final int HGLIB_DEV_OPERATECODE_IMAGE_PROC_FATAL = 0x117;
+ public static final int HGLIB_DEV_OPERATECODE_SCANNER_ERR_IMAGE_ORDER = 0x11C;
+
+ // 2:USB错误
+ public static final int HGLIB_DEV_OPERATECODE_USB_INIT_FAILED = 0x5B00;
+ public static final int HGLIB_DEV_OPERATECODE_USB_REGISTER_PNP_FAILED = 0x5B01;
+ public static final int HGLIB_DEV_OPERATECODE_USB_CLAIM_INTERFACE_FAILED = 0x5B02;
+
+ // 3:硬件错误
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_NOT_FOUND = 0x0DE00;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_NOT_SUPPORT = 0x0DE01;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_BUSY = 0x0DE02;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_SLEEPING = 0x0DE03;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_COUNT_MODE = 0x0DE04;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_STOPPED = 0x0DE05;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_COVER_OPENNED = 0x0DE06;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_NO_PAPER = 0x0DE07;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_FEEDING_PAPER = 0x0DE08;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_DOUBLE_FEEDING = 0x0DE09;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_PAPER_JAMMED = 0x0DE0A;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_STAPLE_ON = 0x0DE0B;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_PAPER_SKEW = 0x0DE0C;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_SIZE_CHECK = 0x0DE0D;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_DOGEAR = 0x0DE0E;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_NO_IMAGE = 0x0DE0F;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_SCANN_ERROR = 0x0DE10;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_PC_BUSY = 0x0DE11;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_ISLOCK = 0x0DE12;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_UPGRADE_SUCCESSFUL = 0x0DE13;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_UPGRADE_FAIL = 0x0DE14;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_AUTO_FAIL_OVER = 0x0DE15;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_AUTO_FAIL_INFO = 0x0DE16;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_DISTORTION = 0x0DE17;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_MAYBE_IS_HOLE = 0x0DE18;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_DEVS_BOOTING = 0x0DE19;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_UNKNOWN_STATUS = 0x0DE1A;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_LENS_DIRTY = 0x0DE1B;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_OUT_BOUNDARY = 0x0DE1C;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_GET_CT_FAIL = 0x0DE1D;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_JPEG_COMPRESS_FAIL = 0x0DE1E;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_JPEG_FINISH_FAIL = 0x0DE1F;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_THUNK_DATA = 0x0DE20;
+ public static final int HGLIB_DEV_OPERATECODE_DEVICE_WRONG_FIRMWARE_INFO = 0x0DE21;
+
+ // 4:设备状态码
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_UNKNOW = -1;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_NO_PAPER = 0;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_PAPER = 1;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_NOT_FOUND = 2;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_BUSY = 3;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_SLEEPING = 4;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_COUNT_MODE = 5;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_COVER_OPENNED = 6;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_FEEDING_PAPER = 7;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_DOUBLE_FEEDING = 8;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_PAPER_JAMMED = 9;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_STAPLE_ON = 10;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_PAPER_SKEW = 11;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_DOGEAR = 12;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_NO_IMAGE = 13;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_SCANN_ERROR = 14;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_PC_BUSY = 15;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_MAYBE_IS_HOLE = 16;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_DEVS_BOOTING = 17;
+ public static final int HGLIB_DEV_STATUSCODE_DEVICE_LENS_DIRTY = 18;
+
+ // ==================== 组名常量 ====================
+
+ public static final int HGLIB_GROUP_NAME_BASESETTING = 1; // 基本设置
+ public static final int HGLIB_GROUP_NAME_BRIGHTNESS = 2; // 亮度
+ public static final int HGLIB_GROUP_NAME_IMAGEPROCESS = 3; // 图像处理
+ public static final int HGLIB_GROUP_NAME_PAPERFEEDING = 4; // 送纸方式设置
+
+ // ==================== 配置名常量 ====================
+
+ public static final int HGLIB_OPTION_NAME_UNKNOWN = 0; // "未知"
+ public static final int HGLIB_OPTION_NAME_DLSC = 1; // "多流输出"
+ public static final int HGLIB_OPTION_NAME_DLSCLX = 2; // "多流输出类型"
+ public static final int HGLIB_OPTION_NAME_YSMS = 3; // "颜色模式"
+ public static final int HGLIB_OPTION_NAME_HBTXYZ = 4; // "黑白图像阈值"
+ public static final int HGLIB_OPTION_NAME_HDHHBTX_CS = 5; // "灰度或黑白图像 - 除色"
+ public static final int HGLIB_OPTION_NAME_24WCSTX_DLSCCH = 6; // "24位彩色图像 - 多流输出除红"
+ public static final int HGLIB_OPTION_NAME_24WCSTX_DTKCH = 7; // "24位彩色图像 - 答题卡除红"
+ public static final int HGLIB_OPTION_NAME_BJYC = 8; // "背景移除"
+ public static final int HGLIB_OPTION_NAME_BJSCFDFW = 9; // "背景色彩浮动范围"
+ public static final int HGLIB_OPTION_NAME_RHYMH = 10; // "锐化与模糊"
+ public static final int HGLIB_OPTION_NAME_QCMW = 11; // "去除摩尔纹"
+ public static final int HGLIB_OPTION_NAME_CWW = 12; // "除网纹"
+ public static final int HGLIB_OPTION_NAME_CWKS = 13; // "错误扩散"
+ public static final int HGLIB_OPTION_NAME_HBTXZDYH = 14; // "黑白图像噪点优化"
+ public static final int HGLIB_OPTION_NAME_ZDYHCC = 15; // "噪点优化尺寸"
+ public static final int HGLIB_OPTION_NAME_ZZCC = 16; // "纸张尺寸"
+ public static final int HGLIB_OPTION_NAME_ZDYSMQY = 17; // "自定义扫描区域"
+ public static final int HGLIB_OPTION_NAME_SMQYZCmm = 18; // "扫描区域左侧(mm)"
+ public static final int HGLIB_OPTION_NAME_SMQYYCmm = 19; // "扫描区域右侧(mm)"
+ public static final int HGLIB_OPTION_NAME_SMQYSCmm = 20; // "扫描区域上侧(mm)"
+ public static final int HGLIB_OPTION_NAME_SMQYXCmm = 21; // "扫描区域下侧(mm)"
+ public static final int HGLIB_OPTION_NAME_CCJC = 22; // "尺寸检测"
+ public static final int HGLIB_OPTION_NAME_SMYM = 23; // "扫描页面"
+ public static final int HGLIB_OPTION_NAME_TGKBYLMD = 24; // "跳过空白页灵敏度"
+ public static final int HGLIB_OPTION_NAME_FZQD = 25; // "分纸强度"
+ public static final int HGLIB_OPTION_NAME_XMSJ = 26; // "休眠时间"
+ public static final int HGLIB_OPTION_NAME_FBL = 27; // "分辨率"
+ public static final int HGLIB_OPTION_NAME_HZ = 28; // "画质"
+ public static final int HGLIB_OPTION_NAME_JHZFM = 29; // "交换正反面"
+ public static final int HGLIB_OPTION_NAME_TXCF = 30; // "图像拆分"
+ public static final int HGLIB_OPTION_NAME_ZDJP = 31; // "自动纠偏"
+ public static final int HGLIB_OPTION_NAME_QYSDQX = 32; // "启用色调曲线"
+ public static final int HGLIB_OPTION_NAME_LDZ = 33; // "亮度值"
+ public static final int HGLIB_OPTION_NAME_DBD = 34; // "对比度"
+ public static final int HGLIB_OPTION_NAME_GMZ = 35; // "伽马值"
+ public static final int HGLIB_OPTION_NAME_ZPMS = 36; // "照片模式"
+ public static final int HGLIB_OPTION_NAME_XCHK = 37; // "消除黑框"
+ public static final int HGLIB_OPTION_NAME_SSYZ = 38; // "深色样张"
+ public static final int HGLIB_OPTION_NAME_YZ = 39; // "阈值"
+ public static final int HGLIB_OPTION_NAME_BJKZDJ = 40; // "背景抗噪等级"
+ public static final int HGLIB_OPTION_NAME_BYSJ = 41; // "边缘缩进"
+ public static final int HGLIB_OPTION_NAME_BJTCFS = 42; // "背景填充方式"
+ public static final int HGLIB_OPTION_NAME_FZST = 43; // "防止渗透"
+ public static final int HGLIB_OPTION_NAME_FZSTDJ = 44; // "防止渗透等级"
+ public static final int HGLIB_OPTION_NAME_CKYCZC = 45; // "穿孔移除—左侧"
+ public static final int HGLIB_OPTION_NAME_ZCCKSSFWZFMBL = 46; // #"左侧穿孔搜索范围占幅面比例"
+ public static final int HGLIB_OPTION_NAME_CKYCYC = 47; // "穿孔移除—右侧"
+ public static final int HGLIB_OPTION_NAME_YCCKSSFWZFMBL = 48; // #"右侧穿孔搜索范围占幅面比例"
+ public static final int HGLIB_OPTION_NAME_CKYCSC = 49; // "穿孔移除—上侧"
+ public static final int HGLIB_OPTION_NAME_SCCKSSFWZFMBL = 50; // #"上侧穿孔搜索范围占幅面比例"
+ public static final int HGLIB_OPTION_NAME_CKYCXC = 51; // "穿孔移除—下侧"
+ public static final int HGLIB_OPTION_NAME_XCCKSSFWZFMBL = 52; // #"下侧穿孔搜索范围占幅面比例"
+ public static final int HGLIB_OPTION_NAME_SCTC = 53; // "色彩填充"
+ public static final int HGLIB_OPTION_NAME_CSBJC = 54; // "超声波检测"
+ public static final int HGLIB_OPTION_NAME_SZTPCL = 55; // "双张图片处理"
+ public static final int HGLIB_OPTION_NAME_ZDJC = 56; // "装订检测"
+ public static final int HGLIB_OPTION_NAME_SMZS = 57; // "扫描张数"
+ public static final int HGLIB_OPTION_NAME_SMSL = 58; // "扫描数量"
+ public static final int HGLIB_OPTION_NAME_WGFX = 59; // "文稿方向"
+ public static final int HGLIB_OPTION_NAME_BMXZ180 = 60; // "背面旋转180°"
+ public static final int HGLIB_OPTION_NAME_ZJJC = 61; // "折角检测"
+ public static final int HGLIB_OPTION_NAME_ZJDX = 62; // "折角大小"
+ public static final int HGLIB_OPTION_NAME_WXJC = 63; // "歪斜检测"
+ public static final int HGLIB_OPTION_NAME_WXRRD = 64; // "歪斜容忍度"
+ public static final int HGLIB_OPTION_NAME_ZDCZQD = 65; // 自动分纸强度
+ public static final int HGLIB_OPTION_NAME_CZYZ = 66; // 进纸失败率
+ public static final int HGLIB_OPTION_NAME_DZSM = 67; // 待纸扫描
+ public static final int HGLIB_OPTION_NAME_HBTXFSSC = 68; // 黑白图像反色输出(正常颜色为:0 - 黑色;1 - 白色)
+ public static final int HGLIB_OPTION_NAME_DZMS = 69; // 对折模式
+ public static final int HGLIB_OPTION_NAME_SPJZ = 70; // 色偏校正
+ public static final int HGLIB_OPTION_NAME_DZSMTCSJ = 71; // 待纸扫描退出时间
+ public static final int HGLIB_OPTION_NAME_TGKBY = 72; // 跳过空白页
+ public static final int HGLIB_OPTION_NAME_JTZWJC = 73; // 镜头脏污检测
+ public static final int HGLIB_OPTION_NAME_CKYC = 74; // 穿孔移除
+ public static final int HGLIB_OPTION_NAME_CKSSFWZFMBL = 75; // 穿孔搜索范围占幅面比例
+ public static final int HGLIB_OPTION_NAME_BJJC = 76; // 边界检测
+ public static final int HGLIB_OPTION_NAME_SMCGQXHQD = 77; // 扫描传感器信号强度
+ public static final int HGLIB_OPTION_NAME_TGKBYBYKD = 78; // 跳过空白页边缘宽度
+
+ // ==================== 配置值类型 ====================
+
+ public static final int HGLIB_OPTION_VALUETYPE_INT = 1;
+ public static final int HGLIB_OPTION_VALUETYPE_ENUM = 2;
+ public static final int HGLIB_OPTION_VALUETYPE_DOUBLE = 3;
+ public static final int HGLIB_OPTION_VALUETYPE_BOOL = 4;
+
+ // ==================== 配置值范围类型 ====================
+
+ public static final int HGLIB_OPTION_VALUERANGETYPE_NULL = 0;
+ public static final int HGLIB_OPTION_VALUERANGETYPE_INTLIST = 1;
+ public static final int HGLIB_OPTION_VALUERANGETYPE_ENUMLIST = 2;
+ public static final int HGLIB_OPTION_VALUERANGETYPE_DOUBLELIST = 3;
+ public static final int HGLIB_OPTION_VALUERANGETYPE_INTRANGE = 4;
+ public static final int HGLIB_OPTION_VALUERANGETYPE_DOUBLERANGE = 5;
+}
diff --git a/src/main/java/vip/jcfd/sdk/HGScannerLib.java b/src/main/java/vip/jcfd/sdk/HGScannerLib.java
new file mode 100644
index 0000000..be64b68
--- /dev/null
+++ b/src/main/java/vip/jcfd/sdk/HGScannerLib.java
@@ -0,0 +1,354 @@
+package vip.jcfd.sdk;
+
+import com.sun.jna.Callback;
+import com.sun.jna.Native;
+import com.sun.jna.Pointer;
+import com.sun.jna.Structure;
+import com.sun.jna.ptr.IntByReference;
+import com.sun.jna.win32.StdCallLibrary;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * JNA接口映射 - 基于HGScannerLib.h头文件
+ * 扫描仪库的主要功能接口
+ */
+public interface HGScannerLib extends HGDef, StdCallLibrary {
+
+ // 库加载路径配置
+ String JNA_LIBRARY_NAME = System.getProperty("os.name").toLowerCase().contains("win")
+ ? "HGScannerLib" : "libHGScannerLib";
+
+ // ==================== 常量定义 ====================
+
+ // 图像类型
+ long HGLIB_IMGTYPE_BINARY = 1L;
+ long HGLIB_IMGTYPE_GRAY = 2L;
+ long HGLIB_IMGTYPE_BGR = 3L;
+ long HGLIB_IMGTYPE_RGB = 4L;
+ long HGLIB_IMGTYPE_BGRA = 5L;
+ long HGLIB_IMGTYPE_RGBA = 6L;
+
+ // 图像数据保存方式
+ long HGLIB_IMGORIGIN_TOP = 1L;
+ long HGLIB_IMGORIGIN_BOTTOM = 2L;
+
+ // TIFF压缩方式
+ long HGLIB_TIFFCOMPRESSION_NONE = 1L;
+ long HGLIB_TIFFCOMPRESSION_CCITTFAX4 = 2L;
+ long HGLIB_TIFFCOMPRESSION_LZW = 3L;
+ long HGLIB_TIFFCOMPRESSION_JPEG = 4L;
+
+ // 设备错误码 - 软件逻辑错误
+ long HGLIB_DEV_OPERATECODE_GOOD = 0L;
+ long HGLIB_DEV_OPERATECODE_UNSUPPORTED = 1L;
+ long HGLIB_DEV_OPERATECODE_CANCELLED = 2L;
+ long HGLIB_DEV_OPERATECODE_BUSY = 3L;
+ long HGLIB_DEV_OPERATECODE_INVAL = 4L;
+ long HGLIB_DEV_OPERATECODE_EOF = 5L;
+ long HGLIB_DEV_OPERATECODE_JAMMED = 6L;
+ long HGLIB_DEV_OPERATECODE_NO_DOCS = 7L;
+ long HGLIB_DEV_OPERATECODE_COVER_OPEN = 8L;
+ long HGLIB_DEV_OPERATECODE_IO_ERROR = 9L;
+ long HGLIB_DEV_OPERATECODE_NO_MEM = 10L;
+ long HGLIB_DEV_OPERATECODE_ACCESS_DENIED = 11L;
+
+ // 设备热拔插事件
+ long HGLIB_DEVHOTPLUG_EVENT_ARRIVE = 1L;
+ long HGLIB_DEVHOTPLUG_EVENT_REMOVE = 2L;
+
+ // 设备扫描事件
+ long HGLIB_DEVSCAN_EVENT_BEGIN = 1L;
+ long HGLIB_DEVSCAN_EVENT_END = 2L;
+ long HGLIB_DEVSCAN_EVENT_INFO = 3L;
+
+ // ==================== 句柄类型 ====================
+
+ class HGLibImage extends Pointer {
+ public HGLibImage() {
+ super(0);
+ }
+
+ public HGLibImage(long peer) {
+ super(peer);
+ }
+ }
+
+ class HGLibDevice extends Pointer {
+ public HGLibDevice() {
+ super(0);
+ }
+
+ public HGLibDevice(long peer) {
+ super(peer);
+ }
+ }
+
+ // ==================== 结构体定义 ====================
+
+ @Structure.FieldOrder({"size", "jpegQuality", "tiffCompression", "tiffJpegQuality", "ocr", "jp2Ratio"})
+ class HGLibSaveImageParam extends Structure {
+ public int size; // 结构体大小,必须初始化为sizeof(HGLibSaveImageParam)
+ public int jpegQuality; // jpeg下有效, 0-100
+ public int tiffCompression; // tiff下有效, HGLIB_TIFFCOMPRESSION_*
+ public int tiffJpegQuality; // tiff且HGLIB_TIFFCOMPRESSION_JPEG下有效, 0-100
+ public int ocr; // 是否OCR,pdf和ofd格式有效
+ public float jp2Ratio; // jp2压缩比
+
+ public HGLibSaveImageParam() {
+ super();
+ this.size = size();
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("size", "jpegQuality", "tiffCompression", "tiffJpegQuality", "ocr", "jp2Ratio");
+ }
+ }
+
+ @Structure.FieldOrder({"width", "height", "type", "widthStep", "origin"})
+ class HGLibImageInfo extends Structure {
+ public int width; // 宽(像素),列数
+ public int height; // 高(像素),行数
+ public int type; // 类型,参见HGLIB_IMGTYPE_*
+ public int widthStep; // 每行的字节数
+ public int origin; // 数据排列方式,参见HGLIB_IMGORIGIN_*
+
+ public HGLibImageInfo() {
+ }
+
+ public static class ByReference extends HGLibImageInfo implements Structure.ByReference {
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("width", "height", "type", "widthStep", "origin");
+ }
+ }
+
+ @Structure.FieldOrder({"value", "count"})
+ class HGLibDeviceIntValueList extends Structure {
+ public Pointer value; // HGInt*
+ public int count;
+
+ public HGLibDeviceIntValueList() {
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("value", "count");
+ }
+ }
+
+ @Structure.FieldOrder({"value", "count"})
+ class HGLibDeviceEnumValueList extends Structure {
+ public Pointer value; // HGUInt*
+ public int count;
+
+ public HGLibDeviceEnumValueList() {
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("value", "count");
+ }
+ }
+
+ @Structure.FieldOrder({"value", "count"})
+ class HGLibDeviceDoubleValueList extends Structure {
+ public Pointer value; // HGDouble*
+ public int count;
+
+ public HGLibDeviceDoubleValueList() {
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("value", "count");
+ }
+ }
+
+ @Structure.FieldOrder({"minValue", "maxValue"})
+ class HGLibDeviceIntValueRange extends Structure {
+ public int minValue;
+ public int maxValue;
+
+ public HGLibDeviceIntValueRange() {
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("minValue", "maxValue");
+ }
+ }
+
+ @Structure.FieldOrder({"minValue", "maxValue"})
+ class HGLibDeviceDoubleValueRange extends Structure {
+ public double minValue;
+ public double maxValue;
+
+ public HGLibDeviceDoubleValueRange() {
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("minValue", "maxValue");
+ }
+ }
+
+ // 使用联合体需要在JNA中特殊处理
+ @Structure.FieldOrder({"option", "type", "intValue", "enumValue", "doubleValue", "boolValue", "rangeType", "unionData"})
+ class HGLibDeviceParam extends Structure {
+ public static class ByValue extends HGLibDeviceParam implements Structure.ByValue {
+ }
+
+ public int option; // 配置名, 参见HGLIB_OPTION_NAME_*
+ public int type; // 值类型, 参见HGLIB_OPTION_VALUETYPE_*
+ public int intValue; // 整数值
+ public int enumValue; // 枚举值
+ public double doubleValue; // 双精度值
+ public int boolValue; // 布尔值
+ public int rangeType; // 值范围类型, 参见HGLIB_OPTION_VALUERANGETYPE_*
+ public Pointer unionData; // 联合数据,需要根据rangeType进行类型转换
+
+ public HGLibDeviceParam() {
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("option", "type", "intValue", "enumValue", "doubleValue", "boolValue", "rangeType", "unionData");
+ }
+ }
+
+ @Structure.FieldOrder({"group", "param", "paramCount"})
+ class HGLibDeviceParamGroup extends Structure {
+ public int group; // 组名, 参见HGLIB_GROUP_NAME_*
+ public Pointer param; // HGLibDeviceParam*
+ public int paramCount;
+
+ public HGLibDeviceParamGroup() {
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList("group", "param", "paramCount");
+ }
+ }
+
+ // ==================== 回调函数定义 ====================
+
+ interface HGLibDeviceHotPlugEventFunc extends Callback {
+ void invoke(int event, String deviceName, Pointer param);
+ }
+
+ interface HGLibDeviceScanEventFunc extends Callback {
+ void invoke(HGLibDevice device, int event, int operateCode, String info, Pointer param);
+ }
+
+ interface HGLibDeviceScanImageFunc extends Callback {
+ void invoke(HGLibDevice device, HGLibImage image, Pointer param);
+ }
+
+ // ==================== 函数接口定义 ====================
+
+ // 内存拷贝
+ boolean HGLib_MemoryCopy(Pointer dest, Pointer src, int size);
+
+ // 图像相关函数
+ HGLibImage HGLib_LoadImage(String filePath);
+
+ HGLibImage HGLib_CloneImage(HGLibImage image, int type, int origin);
+
+ Pointer HGLib_GetImageData(HGLibImage image);
+
+ boolean HGLib_GetImageInfo(HGLibImage image, HGLibImageInfo.ByReference imageInfo);
+
+ boolean HGLib_GetImageDpi(HGLibImage image, IntByReference xDpi, IntByReference yDpi);
+
+ boolean HGLib_SaveImage(HGLibImage image, String savePath, HGLibSaveImageParam saveParam);
+
+ boolean HGLib_ReleaseImage(HGLibImage image);
+
+ String HGLib_GetOcrText(HGLibImage image);
+
+ boolean HGLib_ReleaseOcrText(String ocrText);
+
+ // 设备相关函数
+ boolean HGLib_InitDevice(HGLibDeviceHotPlugEventFunc func, Pointer param);
+
+ boolean HGLib_DeinitDevice();
+
+ Pointer HGLib_GetDeviceNameList();
+
+ boolean HGLib_ReleaseDeviceNameList(Pointer deviceNameList);
+
+ HGLibDevice HGLib_OpenDevice(String deviceName);
+
+ boolean HGLib_CloseDevice(HGLibDevice device);
+
+ boolean HGLib_GetDeviceType(HGLibDevice device, byte[] type, int maxLen);
+
+ boolean HGLib_GetDeviceSN(HGLibDevice device, byte[] sn, int maxLen);
+
+ boolean HGLib_GetDeviceFWVersion(HGLibDevice device, byte[] fwVersion, int maxLen);
+
+ boolean HGLib_GetDevicePD(HGLibDevice device, byte[] pd, int maxLen);
+
+ boolean HGLib_GetDevicePatchId(HGLibDevice device, byte[] patchId, int maxLen);
+
+ int HGLib_GetDeviceRollerCount(HGLibDevice device);
+
+ int HGLib_GetDeviceTotalCount(HGLibDevice device);
+
+ boolean HGLib_ClearDeviceRollerCount(HGLibDevice device);
+
+ boolean HGLib_SetDeviceToken(HGLibDevice device, String code);
+
+ boolean HGLib_SetOriginalImage(HGLibDevice device, int isOriginal);
+
+ // 设备参数相关函数
+ boolean HGLib_SetDeviceParam(HGLibDevice device, int option, Pointer data);
+
+ Pointer HGLib_GetDeviceParamGroupList(HGLibDevice device, IntByReference count);
+
+ Pointer HGLib_GetDeviceParam(HGLibDevice device, int option);
+
+ boolean HGLib_ReleaseDeviceParamGroupList(Pointer paramGroup, int count);
+
+ boolean HGLib_ReleaseDeviceParam(Pointer param);
+
+ boolean HGLib_ResetDeviceParam(HGLibDevice device);
+
+ // 设备状态相关函数
+ boolean HGLib_DeviceIsPaperOn(HGLibDevice device);
+
+ int HGLib_GetDeviceStatus(HGLibDevice device);
+
+ boolean HGLib_GetDeviceIsOnline(HGLibDevice device);
+
+ boolean HGLib_DeviceRestart(HGLibDevice device);
+
+ boolean HGLib_DeviceShutDown(HGLibDevice device);
+
+ // 扫描相关函数
+ boolean HGLib_StartDeviceScan(HGLibDevice device, HGLibDeviceScanEventFunc eventFunc, Pointer eventParam,
+ HGLibDeviceScanImageFunc imageFunc, Pointer imageParam);
+
+ boolean HGLib_StopDeviceScan(HGLibDevice device);
+
+ boolean HGLib_StopDeviceScanAsyn(HGLibDevice device);
+
+ int HGLib_GetDeviceOperateCode(HGLibDevice device);
+
+ int HGLib_GetDevicePageId(HGLibDevice device);
+
+ // ==================== 工厂方法 ====================
+
+ /**
+ * 获取扫描仪库实例
+ *
+ * @return 扫描仪库实例
+ */
+ HGScannerLib INSTANCE = Native.load(JNA_LIBRARY_NAME, HGScannerLib.class);
+}
diff --git a/src/main/java/vip/jcfd/sdk/HGScannerWrapper.java b/src/main/java/vip/jcfd/sdk/HGScannerWrapper.java
new file mode 100644
index 0000000..677f306
--- /dev/null
+++ b/src/main/java/vip/jcfd/sdk/HGScannerWrapper.java
@@ -0,0 +1,387 @@
+package vip.jcfd.sdk;
+
+import com.sun.jna.Memory;
+import com.sun.jna.Native;
+import com.sun.jna.Pointer;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 扫描仪JNA封装类
+ * 提供更友好的Java API接口,简化JNA调用
+ */
+public class HGScannerWrapper {
+
+ private static final int STRING_BUFFER_SIZE = 256;
+ private static HGScannerLib scannerLib;
+
+ static {
+ scannerLib = HGScannerLib.INSTANCE;
+ }
+
+ /**
+ * 初始化扫描仪
+ *
+ * @param hotPlugCallback 热拔插事件回调,可以为null
+ * @param param 回调参数
+ * @return 是否初始化成功
+ */
+ public static boolean initialize(HGScannerLib.HGLibDeviceHotPlugEventFunc hotPlugCallback, Pointer param) {
+ return scannerLib.HGLib_InitDevice(hotPlugCallback, param);
+ }
+
+ /**
+ * 反初始化扫描仪
+ *
+ * @return 是否反初始化成功
+ */
+ public static boolean deinitialize() {
+ return scannerLib.HGLib_DeinitDevice();
+ }
+
+ /**
+ * 获取设备名称列表
+ *
+ * @return 设备名称列表
+ */
+ public static List getDeviceNameList() {
+ Pointer nameListPtr = scannerLib.HGLib_GetDeviceNameList();
+ if (nameListPtr == null || nameListPtr.equals(Pointer.NULL)) {
+ return new ArrayList<>();
+ }
+
+ List deviceNames = new ArrayList<>();
+ try {
+ // 遍历指针数组,直到遇到null指针
+ int offset = 0;
+ while (true) {
+ Pointer namePtr = nameListPtr.getPointer((long) offset * Native.POINTER_SIZE);
+ if (namePtr == null || namePtr.equals(Pointer.NULL)) {
+ break;
+ }
+ String deviceName = namePtr.getString(0, StandardCharsets.UTF_8.name());
+ deviceNames.add(deviceName);
+ offset++;
+ }
+ } finally {
+ scannerLib.HGLib_ReleaseDeviceNameList(nameListPtr);
+ }
+
+ return deviceNames;
+ }
+
+ /**
+ * 打开设备
+ *
+ * @param deviceName 设备名称
+ * @return 设备句柄
+ */
+ public static HGScannerLib.HGLibDevice openDevice(String deviceName) {
+ return scannerLib.HGLib_OpenDevice(deviceName);
+ }
+
+ /**
+ * 关闭设备
+ *
+ * @param device 设备句柄
+ * @return 是否关闭成功
+ */
+ public static boolean closeDevice(HGScannerLib.HGLibDevice device) {
+ return scannerLib.HGLib_CloseDevice(device);
+ }
+
+ /**
+ * 获取设备型号
+ *
+ * @param device 设备句柄
+ * @return 设备型号
+ */
+ public static String getDeviceType(HGScannerLib.HGLibDevice device) {
+ byte[] buffer = new byte[STRING_BUFFER_SIZE];
+ boolean result = scannerLib.HGLib_GetDeviceType(device, buffer, buffer.length);
+ if (result) {
+ // 找到第一个0字节的位置
+ int length = 0;
+ while (length < buffer.length && buffer[length] != 0) {
+ length++;
+ }
+ return new String(buffer, 0, length, StandardCharsets.UTF_8);
+ }
+ return null;
+ }
+
+ /**
+ * 获取设备序列号
+ *
+ * @param device 设备句柄
+ * @return 设备序列号
+ */
+ public static String getDeviceSerialNumber(HGScannerLib.HGLibDevice device) {
+ byte[] buffer = new byte[STRING_BUFFER_SIZE];
+ boolean result = scannerLib.HGLib_GetDeviceSN(device, buffer, buffer.length);
+ if (result) {
+ // 找到第一个0字节的位置
+ int length = 0;
+ while (length < buffer.length && buffer[length] != 0) {
+ length++;
+ }
+ return new String(buffer, 0, length, StandardCharsets.UTF_8);
+ }
+ return null;
+ }
+
+ /**
+ * 获取设备固件版本
+ *
+ * @param device 设备句柄
+ * @return 固件版本
+ */
+ public static String getDeviceFirmwareVersion(HGScannerLib.HGLibDevice device) {
+ byte[] buffer = new byte[STRING_BUFFER_SIZE];
+ boolean result = scannerLib.HGLib_GetDeviceFWVersion(device, buffer, buffer.length);
+ if (result) {
+ // 找到第一个0字节的位置
+ int length = 0;
+ while (length < buffer.length && buffer[length] != 0) {
+ length++;
+ }
+ return new String(buffer, 0, length, StandardCharsets.UTF_8);
+ }
+ return null;
+ }
+
+ /**
+ * 加载图像
+ *
+ * @param filePath 图像文件路径
+ * @return 图像句柄
+ */
+ public static HGScannerLib.HGLibImage loadImage(String filePath) {
+ return scannerLib.HGLib_LoadImage(filePath);
+ }
+
+ /**
+ * 获取图像信息
+ *
+ * @param image 图像句柄
+ * @return 图像信息
+ */
+ public static HGScannerLib.HGLibImageInfo getImageInfo(HGScannerLib.HGLibImage image) {
+ HGScannerLib.HGLibImageInfo.ByReference imageInfoRef = new HGScannerLib.HGLibImageInfo.ByReference();
+ boolean result = scannerLib.HGLib_GetImageInfo(image, imageInfoRef);
+ return result ? imageInfoRef : null;
+ }
+
+ /**
+ * 获取图像数据
+ *
+ * @param image 图像句柄
+ * @return 图像数据
+ */
+ public static byte[] getImageData(HGScannerLib.HGLibImage image) {
+ HGScannerLib.HGLibImageInfo info = getImageInfo(image);
+ if (info == null) {
+ return null;
+ }
+
+ Pointer dataPtr = scannerLib.HGLib_GetImageData(image);
+ if (dataPtr == null || dataPtr.equals(Pointer.NULL)) {
+ return null;
+ }
+
+ byte[] data = new byte[info.widthStep * info.height];
+ dataPtr.read(0, data, 0, data.length);
+ return data;
+ }
+
+ /**
+ * 保存图像
+ *
+ * @param image 图像句柄
+ * @param savePath 保存路径
+ * @param jpegQuality JPEG质量 (0-100),仅对JPEG格式有效
+ * @param ocr 是否启用OCR,仅对PDF和OFD格式有效
+ * @return 是否保存成功
+ */
+ public static boolean saveImage(HGScannerLib.HGLibImage image, String savePath, int jpegQuality, boolean ocr) {
+ HGScannerLib.HGLibSaveImageParam saveParam = new HGScannerLib.HGLibSaveImageParam();
+ saveParam.jpegQuality = jpegQuality;
+ saveParam.ocr = ocr ? 1 : 0;
+
+ return scannerLib.HGLib_SaveImage(image, savePath, saveParam);
+ }
+
+ /**
+ * 开始扫描
+ *
+ * @param device 设备句柄
+ * @param eventCallback 扫描事件回调
+ * @param imageCallback 扫描图像回调
+ * @param param 回调参数
+ * @return 是否开始扫描成功
+ */
+ public static boolean startScan(HGScannerLib.HGLibDevice device,
+ HGScannerLib.HGLibDeviceScanEventFunc eventCallback,
+ HGScannerLib.HGLibDeviceScanImageFunc imageCallback,
+ Pointer param) {
+ return scannerLib.HGLib_StartDeviceScan(device, eventCallback, param, imageCallback, param);
+ }
+
+ /**
+ * 停止扫描
+ *
+ * @param device 设备句柄
+ * @return 是否停止扫描成功
+ */
+ public static boolean stopScan(HGScannerLib.HGLibDevice device) {
+ return scannerLib.HGLib_StopDeviceScan(device);
+ }
+
+ /**
+ * 停止扫描(异步)
+ *
+ * @param device 设备句柄
+ * @return 是否停止扫描成功
+ */
+ public static boolean stopScanAsync(HGScannerLib.HGLibDevice device) {
+ return scannerLib.HGLib_StopDeviceScanAsyn(device);
+ }
+
+ /**
+ * 获取设备错误码
+ *
+ * @param device 设备句柄
+ * @return 错误码
+ */
+ public static int getDeviceOperateCode(HGScannerLib.HGLibDevice device) {
+ return scannerLib.HGLib_GetDeviceOperateCode(device);
+ }
+
+ /**
+ * 获取设备状态
+ *
+ * @param device 设备句柄
+ * @return 状态码
+ */
+ public static int getDeviceStatus(HGScannerLib.HGLibDevice device) {
+ return scannerLib.HGLib_GetDeviceStatus(device);
+ }
+
+ /**
+ * 设备是否有纸
+ *
+ * @param device 设备句柄
+ * @return 是否有纸
+ */
+ public static boolean isPaperOn(HGScannerLib.HGLibDevice device) {
+ return scannerLib.HGLib_DeviceIsPaperOn(device);
+ }
+
+ /**
+ * 获取设备是否在线
+ *
+ * @param device 设备句柄
+ * @return 是否在线
+ */
+ public static boolean isOnline(HGScannerLib.HGLibDevice device) {
+ return scannerLib.HGLib_GetDeviceIsOnline(device);
+ }
+
+ /**
+ * 设置设备参数
+ *
+ * @param device 设备句柄
+ * @param option 配置名,参考HGLIB_OPTION_NAME_*
+ * @param value 参数值
+ * @return 是否设置成功
+ */
+ public static boolean setDeviceParam(HGScannerLib.HGLibDevice device, int option, int value) {
+ Memory memory = new Memory(4);
+ memory.setInt(0, value);
+ return scannerLib.HGLib_SetDeviceParam(device, option, memory);
+ }
+
+ /**
+ * 设置设备参数
+ *
+ * @param device 设备句柄
+ * @param option 配置名,参考HGLIB_OPTION_NAME_*
+ * @param value 参数值
+ * @return 是否设置成功
+ */
+ public static boolean setDeviceParam(HGScannerLib.HGLibDevice device, int option, double value) {
+ Memory memory = new Memory(8);
+ memory.setDouble(0, value);
+ return scannerLib.HGLib_SetDeviceParam(device, option, memory);
+ }
+
+ /**
+ * 设置设备参数
+ *
+ * @param device 设备句柄
+ * @param option 配置名,参考HGLIB_OPTION_NAME_*
+ * @param value 参数值
+ * @return 是否设置成功
+ */
+ public static boolean setDeviceParam(HGScannerLib.HGLibDevice device, int option, boolean value) {
+ Memory memory = new Memory(4);
+ memory.setInt(0, value ? 1 : 0);
+ return scannerLib.HGLib_SetDeviceParam(device, option, memory);
+ }
+
+ /**
+ * 克隆图像
+ *
+ * @param image 源图像句柄
+ * @param type 图像类型,参考HGLIB_IMGTYPE_*
+ * @param origin 图像数据排列方式,参考HGLIB_IMGORIGIN_*
+ * @return 克隆后的图像句柄
+ */
+ public static HGScannerLib.HGLibImage cloneImage(HGScannerLib.HGLibImage image, int type, int origin) {
+ return scannerLib.HGLib_CloneImage(image, type, origin);
+ }
+
+ /**
+ * 释放图像
+ *
+ * @param image 图像句柄
+ * @return 是否释放成功
+ */
+ public static boolean releaseImage(HGScannerLib.HGLibImage image) {
+ return scannerLib.HGLib_ReleaseImage(image);
+ }
+
+ /**
+ * 获取图像OCR文本
+ *
+ * @param image 图像句柄
+ * @return OCR文本
+ */
+ public static String getOcrText(HGScannerLib.HGLibImage image) {
+ return scannerLib.HGLib_GetOcrText(image);
+ }
+
+ /**
+ * 释放OCR文本
+ *
+ * @param ocrText OCR文本
+ * @return 是否释放成功
+ */
+ public static boolean releaseOcrText(String ocrText) {
+ return scannerLib.HGLib_ReleaseOcrText(ocrText);
+ }
+
+ /**
+ * 内存拷贝
+ *
+ * @param dest 目标地址
+ * @param src 源地址
+ * @param size 拷贝大小
+ * @return 是否拷贝成功
+ */
+ public static boolean memoryCopy(Pointer dest, Pointer src, int size) {
+ return scannerLib.HGLib_MemoryCopy(dest, src, size);
+ }
+}
diff --git a/src/main/resources/c/HGDef.h b/src/main/resources/c/HGDef.h
new file mode 100644
index 0000000..200785c
--- /dev/null
+++ b/src/main/resources/c/HGDef.h
@@ -0,0 +1,165 @@
+#ifndef __HGDEF_H__
+#define __HGDEF_H__
+
+/****************************************************************************
+ * Platform Dependent Definitions and Typedefs *
+ ****************************************************************************/
+
+ /* Microsoft C/C++ Compiler */
+#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) || defined (_WINDOWS)
+
+ #define HG_CMP_MSC
+ #if defined(_WIN64) || defined(WIN64)
+ #define HG_64BIT
+ #elif defined(_WIN32) || defined(WIN32)
+ #define HG_32BIT
+ #endif
+
+/* Apple Compiler (which is GNU now) */
+#elif defined(__APPLE__)
+
+ #define HG_CMP_XCODE
+ #define HG_64BIT
+
+/* GNU C/C++ Compiler */
+#elif defined(__GNUC__)
+
+ #define HG_CMP_GNU
+ #if defined(__alpha__) || defined(__ia64__) || defined(__ppc64__) || defined(__s390x__) || defined(__x86_64__)
+ #define HG_64BIT
+ #else
+ #define HG_32BIT
+ #endif
+
+/* Unrecognized */
+#else
+
+ #error Unrecognized compiler
+
+#endif
+
+#if defined(HG_CMP_MSC)
+ #ifndef WIN32_LEAN_AND_MEAN
+ #define WIN32_LEAN_AND_MEAN
+ #endif
+ #ifndef _CRT_SECURE_NO_WARNINGS
+ #define _CRT_SECURE_NO_WARNINGS
+ #endif
+#endif
+
+/* type defines */
+typedef void HGVoid;
+typedef char HGChar;
+typedef unsigned char HGByte;
+typedef short HGShort;
+typedef unsigned short HGUShort;
+typedef int HGInt;
+typedef unsigned int HGUInt;
+typedef long long HGLonglong;
+typedef unsigned long long HGULonglong;
+typedef void* HGPointer;
+typedef HGInt HGBool;
+typedef float HGFloat;
+typedef double HGDouble;
+#ifdef HG_64BIT
+ typedef HGLonglong HGSize;
+ typedef HGULonglong HGUSize;
+#else
+ typedef HGInt HGSize;
+ typedef HGUInt HGUSize;
+#endif
+
+typedef HGUInt HGColor;
+
+#define HG_MAKECOLOR(r, g, b, a) (HGColor)(((HGUInt)a << 24) | ((HGUInt)b << 16) | ((HGUInt)g << 8) | (HGUInt)r)
+#define HG_GETCOLOR_R(color) (HGUInt)((HGColor)color & 0xFF)
+#define HG_GETCOLOR_G(color) (HGUInt)(((HGColor)color >> 8) & 0xFF)
+#define HG_GETCOLOR_B(color) (HGUInt)(((HGColor)color >> 16) & 0xFF)
+#define HG_GETCOLOR_A(color) (HGUInt)(((HGColor)color >> 24) & 0xFF)
+
+/* error code */
+typedef HGUInt HGResult;
+
+#define HGTRUE 1
+#define HGFALSE 0
+
+#ifndef HGMAX
+ #define HGMAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+#ifndef HGMIN
+ #define HGMIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#if defined(HG_CMP_MSC)
+ #ifdef __cplusplus
+ #define HGEXPORT extern "C"
+ #else
+ #define HGEXPORT
+ #endif /* __cplusplus */
+ #define HGAPI __stdcall
+ #define HGAPIV __cdecl
+#else
+ #ifdef __cplusplus
+ #define HGEXPORT extern "C"
+ #else
+ #define HGEXPORT
+ #endif /* __cplusplus */
+ #define HGAPI
+ #define HGAPIV
+#endif
+
+#if defined(HG_CMP_MSC)
+ #include
+ typedef HWND HGWindow;
+#else
+ #ifdef __cplusplus
+ typedef class QWidget* HGWindow;
+ #else
+ typedef void* HGWindow;
+ #endif
+#endif
+
+#if defined(HG_CMP_MSC)
+ #define HG_SEP_CHAR '\\'
+ #define HG_SEP_STRING "\\"
+#else
+ #define HG_SEP_CHAR '/'
+ #define HG_SEP_STRING "/"
+#endif
+
+#define HG_DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
+
+#pragma pack(push)
+#pragma pack(4)
+
+typedef struct
+{
+ HGInt left;
+ HGInt top;
+ HGInt right;
+ HGInt bottom;
+}HGRect;
+
+typedef struct
+{
+ HGFloat left;
+ HGFloat top;
+ HGFloat right;
+ HGFloat bottom;
+}HGRectF;
+
+typedef struct
+{
+ HGInt x;
+ HGInt y;
+}HGPoint;
+
+typedef struct
+{
+ HGFloat x;
+ HGFloat y;
+}HGPointF;
+
+#pragma pack(pop)
+
+#endif /* __HGDEF_H__ */
diff --git a/src/main/resources/c/HGScannerLib.h b/src/main/resources/c/HGScannerLib.h
new file mode 100644
index 0000000..86b26a7
--- /dev/null
+++ b/src/main/resources/c/HGScannerLib.h
@@ -0,0 +1,745 @@
+#ifndef __HGSCANNERLIB_H__
+#define __HGSCANNERLIB_H__
+
+#include "HGDef.h"
+
+HG_DECLARE_HANDLE(HGLibImage);
+HG_DECLARE_HANDLE(HGLibDevice);
+
+/* 1位黑白图 */
+#define HGLIB_IMGTYPE_BINARY 1L
+/* 8位灰度图 */
+#define HGLIB_IMGTYPE_GRAY 2L
+/* 24位真彩色,B8G8R8格式 */
+#define HGLIB_IMGTYPE_BGR 3L
+/* 24位真彩色,R8G8B8格式 */
+#define HGLIB_IMGTYPE_RGB 4L
+/* 32位真彩色,带Alpha通道,B8G8R8A8格式 */
+#define HGLIB_IMGTYPE_BGRA 5L
+/* 32位真彩色,带Alpha通道,R8G8B8A8格式 */
+#define HGLIB_IMGTYPE_RGBA 6L
+
+/* 图像数据保存方式 */
+#define HGLIB_IMGORIGIN_TOP 1L
+#define HGLIB_IMGORIGIN_BOTTOM 2L
+
+/* TIFF压缩方式 */
+#define HGLIB_TIFFCOMPRESSION_NONE 1L
+#define HGLIB_TIFFCOMPRESSION_CCITTFAX4 2L
+#define HGLIB_TIFFCOMPRESSION_LZW 3L
+#define HGLIB_TIFFCOMPRESSION_JPEG 4L
+
+/* 设备错误码 */
+#define HGLIB_DEV_OPERATECODE_GOOD 0L /* everything A-OK */
+#define HGLIB_DEV_OPERATECODE_UNSUPPORTED 1L /* operation is not supported */
+#define HGLIB_DEV_OPERATECODE_CANCELLED 2L /* operation was cancelled */
+#define HGLIB_DEV_OPERATECODE_BUSY 3L /* device is busy; try again later */
+#define HGLIB_DEV_OPERATECODE_INVAL 4L /* data is invalid (includes no dev at open) */
+#define HGLIB_DEV_OPERATECODE_EOF 5L /* no more data available (end-of-file) */
+#define HGLIB_DEV_OPERATECODE_JAMMED 6L /* document feeder jammed */
+#define HGLIB_DEV_OPERATECODE_NO_DOCS 7L /* document feeder out of documents */
+#define HGLIB_DEV_OPERATECODE_COVER_OPEN 8L /* scanner cover is open */
+#define HGLIB_DEV_OPERATECODE_IO_ERROR 9L /* error during device I/O */
+#define HGLIB_DEV_OPERATECODE_NO_MEM 10L /* out of memory */
+#define HGLIB_DEV_OPERATECODE_ACCESS_DENIED 11L /* access to resource has been denied */
+// 1:软件逻辑错误
+#define HGLIB_DEV_OPERATECODE_INVALID_PARAMETER 0x100 // 非法的参数调用
+#define HGLIB_DEV_OPERATECODE_ERR_USER_CANCELED 0x101 // 用户取消了操作
+#define HGLIB_DEV_OPERATECODE_INSUFFICIENT_MEMORY 0x102 // 分配的内存不足
+#define HGLIB_DEV_OPERATECODE_ACCESS_DENIED 0x103 // 访问被拒绝
+#define HGLIB_DEV_OPERATECODE_IO_PENDING 0x104 // 异步访问,数据稍后返回
+#define HGLIB_DEV_OPERATECODE_ERR_NOT_EXACT 0x105 // 数据不精确,精确的数据已经在同一缓存中返回
+#define HGLIB_DEV_OPERATECODE_ERR_CONFIGURATION_CHANGED 0x106 // 设备的配置项发生改变,需要重新加载显示
+#define HGLIB_DEV_OPERATECODE_ERR_NOT_OPEN 0x107 // 设备未打开
+#define HGLIB_DEV_OPERATECODE_ERR_NOT_START 0x108 // 设备没有启动
+#define HGLIB_DEV_OPERATECODE_ERR_NOT_ANY_MORE 0x109 // 用于回调返回,在本次扫描中,对相同操作不再回调
+#define HGLIB_DEV_OPERATECODE_ERR_NO_DATA 0x10A // 没有数据
+#define HGLIB_DEV_OPERATECODE_HAS_DATA_YET 0x10B // 有数据未被读取(异步操作中)
+#define HGLIB_DEV_OPERATECODE_OUT_OF_RANGE 0x10C // 相关操作超出范围
+#define HGLIB_DEV_OPERATECODE_IO 0x10D // IO错误
+#define HGLIB_DEV_OPERATECODE_TIMEOUT 0x10E // 超时错误
+#define HGLIB_DEV_OPERATECODE_OPEN_FILE_FAILED 0x10F // 打开本地文件失败
+#define HGLIB_DEV_OPERATECODE_CREATE_FILE_FAILED 0x110 // 创建本地文件失败
+#define HGLIB_DEV_OPERATECODE_WRITE_FILE_FAILED 0x111 // 写本地文件失败
+#define HGLIB_DEV_OPERATECODE_DATA_DAMAGED 0x112 // 数据损坏(内置资源数据损坏)
+#define HGLIB_DEV_OPERATECODE_OPENED_BY_OTHER_PROCESS 0x113 // 设备已经被其它进程打开占用
+#define HGLIB_DEV_OPERATECODE_LANG_PAK_LOST 0x114 // 语言包丢失
+#define HGLIB_DEV_OPERATECODE_RELOAD_IMAGE_PARAM 0x115 // 配置成功,会影响图像参数,应用需要重新加载图像参数 - added on 2023-02-18 for XSANE修改影响图像参数的属性后扫描崩溃的问题
+#define HGLIB_DEV_OPERATECODE_RELOAD_OPT_PARAM 0x116 // SCANNER_ERR_CONFIGURATION_CHANGED + SCANNER_ERR_RELOAD_IMAGE_PARAM - added on 2023-02-18 for XSANE修改影响图像参数的属性后扫描崩溃的问题
+#define HGLIB_DEV_OPERATECODE_IMAGE_PROC_FATAL 0x117 // 图像处理失败
+#define HGLIB_DEV_OPERATECODE_SCANNER_ERR_IMAGE_ORDER 0x11C // 图像顺序错误
+// 2:USB错误
+#define HGLIB_DEV_OPERATECODE_USB_INIT_FAILED 0x5B00 // libusb_init 失败
+#define HGLIB_DEV_OPERATECODE_USB_REGISTER_PNP_FAILED 0x5B01 // 注册USB监听事件失败
+#define HGLIB_DEV_OPERATECODE_USB_CLAIM_INTERFACE_FAILED 0x5B02 // failed in calling libusb_claim_interface
+// 3:硬件错误
+#define HGLIB_DEV_OPERATECODE_DEVICE_NOT_FOUND 0x0DE00 // 设备未找到
+#define HGLIB_DEV_OPERATECODE_DEVICE_NOT_SUPPORT 0x0DE01 // 设备不支持该操作
+#define HGLIB_DEV_OPERATECODE_DEVICE_BUSY 0x0DE02 // 设备正忙,不能响应该操作
+#define HGLIB_DEV_OPERATECODE_DEVICE_SLEEPING 0x0DE03 // 设备处于睡眠状态
+#define HGLIB_DEV_OPERATECODE_DEVICE_COUNT_MODE 0x0DE04 // 设备处于计数扫描状态
+#define HGLIB_DEV_OPERATECODE_DEVICE_STOPPED 0x0DE05 // 扫描停止
+#define HGLIB_DEV_OPERATECODE_DEVICE_COVER_OPENNED 0x0DE06 // 扫描仪盖板呈打开状态
+#define HGLIB_DEV_OPERATECODE_DEVICE_NO_PAPER 0x0DE07 // 没有纸张输入
+#define HGLIB_DEV_OPERATECODE_DEVICE_FEEDING_PAPER 0x0DE08 // 搓纸失败
+#define HGLIB_DEV_OPERATECODE_DEVICE_DOUBLE_FEEDING 0x0DE09 // 双张检测
+#define HGLIB_DEV_OPERATECODE_DEVICE_PAPER_JAMMED 0x0DE0A // 卡纸
+#define HGLIB_DEV_OPERATECODE_DEVICE_STAPLE_ON 0x0DE0B // 有钉书钉
+#define HGLIB_DEV_OPERATECODE_DEVICE_PAPER_SKEW 0x0DE0C // 纸张倾斜
+#define HGLIB_DEV_OPERATECODE_DEVICE_SIZE_CHECK 0x0DE0D // 尺寸检测错误
+#define HGLIB_DEV_OPERATECODE_DEVICE_DOGEAR 0x0DE0E // 纸张有折角
+#define HGLIB_DEV_OPERATECODE_DEVICE_NO_IMAGE 0x0DE0F // 设备没取到图
+#define HGLIB_DEV_OPERATECODE_DEVICE_SCANN_ERROR 0x0DE10 // 设备扫图失败
+#define HGLIB_DEV_OPERATECODE_DEVICE_PC_BUSY 0x0DE11 // PC繁忙或出错
+#define HGLIB_DEV_OPERATECODE_DEVICE_ISLOCK 0x0DE12 // 设备被锁定
+#define HGLIB_DEV_OPERATECODE_DEVICE_UPGRADE_SUCCESSFUL 0x0DE13 // 固件升级成功
+#define HGLIB_DEV_OPERATECODE_DEVICE_UPGRADE_FAIL 0x0DE14 // 固件升级失败+
+#define HGLIB_DEV_OPERATECODE_DEVICE_AUTO_FAIL_OVER 0x0DE15 // 设备平场自动校正结束
+#define HGLIB_DEV_OPERATECODE_DEVICE_AUTO_FAIL_INFO 0x0DE16 // 设备平场自动校正信息传输
+#define HGLIB_DEV_OPERATECODE_DEVICE_DISTORTION 0x0DE17 // 畸变修正失败
+#define HGLIB_DEV_OPERATECODE_DEVICE_MAYBE_IS_HOLE 0x0DE18 // 纸张有孔洞
+#define HGLIB_DEV_OPERATECODE_DEVICE_DEVS_BOOTING 0x0DE19 // 请稍等 - 设备正在准备
+#define HGLIB_DEV_OPERATECODE_DEVICE_UNKNOWN_STATUS 0x0DE1A // 设备处于未知状态
+#define HGLIB_DEV_OPERATECODE_DEVICE_LENS_DIRTY 0x0DE1B // 镜头脏污
+#define HGLIB_DEV_OPERATECODE_DEVICE_OUT_BOUNDARY 0x0DE1C // 纸张超出边界
+#define HGLIB_DEV_OPERATECODE_DEVICE_GET_CT_FAIL 0x0DE1D // 获取校正数据失败
+#define HGLIB_DEV_OPERATECODE_DEVICE_JPEG_COMPRESS_FAIL 0x0DE1E // JPEG压缩失败
+#define HGLIB_DEV_OPERATECODE_DEVICE_JPEG_FINISH_FAIL 0x0DE1F // JPEG失败
+#define HGLIB_DEV_OPERATECODE_DEVICE_THUNK_DATA 0x0DE20 //
+#define HGLIB_DEV_OPERATECODE_DEVICE_WRONG_FIRMWARE_INFO 0x0DE21 // 获取版本信息异常,请重启软件
+
+// 4:设备状态码
+#define HGLIB_DEV_STATUSCODE_DEVICE_UNKNOW -1 // 未知状态
+#define HGLIB_DEV_STATUSCODE_DEVICE_NO_PAPER 0 // 没有纸张输入
+#define HGLIB_DEV_STATUSCODE_DEVICE_PAPER 1 // 有纸
+#define HGLIB_DEV_STATUSCODE_DEVICE_NOT_FOUND 2 // 设备未找到
+#define HGLIB_DEV_STATUSCODE_DEVICE_BUSY 3 // 设备正忙,不能响应该操作
+#define HGLIB_DEV_STATUSCODE_DEVICE_SLEEPING 4 // 设备处于睡眠状态
+#define HGLIB_DEV_STATUSCODE_DEVICE_COUNT_MODE 5 // 设备处于计数扫描状态
+#define HGLIB_DEV_STATUSCODE_DEVICE_COVER_OPENNED 6 // 扫描仪盖板呈打开状态
+#define HGLIB_DEV_STATUSCODE_DEVICE_FEEDING_PAPER 7 // 搓纸失败
+#define HGLIB_DEV_STATUSCODE_DEVICE_DOUBLE_FEEDING 8 // 双张检测
+#define HGLIB_DEV_STATUSCODE_DEVICE_PAPER_JAMMED 9 // 卡纸
+#define HGLIB_DEV_STATUSCODE_DEVICE_STAPLE_ON 10 // 有钉书钉
+#define HGLIB_DEV_STATUSCODE_DEVICE_PAPER_SKEW 11 // 纸张倾斜
+#define HGLIB_DEV_STATUSCODE_DEVICE_DOGEAR 12 // 纸张有折角
+#define HGLIB_DEV_STATUSCODE_DEVICE_NO_IMAGE 13 // 设备没取到图
+#define HGLIB_DEV_STATUSCODE_DEVICE_SCANN_ERROR 14 // 设备扫图失败
+#define HGLIB_DEV_STATUSCODE_DEVICE_PC_BUSY 15 // PC繁忙或出错
+#define HGLIB_DEV_STATUSCODE_DEVICE_MAYBE_IS_HOLE 16 // 纸张有孔洞
+#define HGLIB_DEV_STATUSCODE_DEVICE_DEVS_BOOTING 17 // 请稍等 - 设备正在准备
+#define HGLIB_DEV_STATUSCODE_DEVICE_LENS_DIRTY 18 // 镜头脏污
+
+/* 设备热拔插事件 */
+#define HGLIB_DEVHOTPLUG_EVENT_ARRIVE 1L
+#define HGLIB_DEVHOTPLUG_EVENT_REMOVE 2L
+
+/* 设备扫描事件 */
+#define HGLIB_DEVSCAN_EVENT_BEGIN 1L
+#define HGLIB_DEVSCAN_EVENT_END 2L
+#define HGLIB_DEVSCAN_EVENT_INFO 3L
+
+/* 组名 */
+// 基本设置
+#define HGLIB_GROUP_NAME_BASESETTING 1L
+// 亮度
+#define HGLIB_GROUP_NAME_BRIGHTNESS 2L
+// 图像处理
+#define HGLIB_GROUP_NAME_IMAGEPROCESS 3L
+// 送纸方式设置
+#define HGLIB_GROUP_NAME_PAPERFEEDING 4L
+
+/* 配置名 */
+#define HGLIB_OPTION_NAME_UNKNOWN 0L
+// "多流输出"
+#define HGLIB_OPTION_NAME_DLSC 1L
+// "多流输出类型"
+#define HGLIB_OPTION_NAME_DLSCLX 2L
+// "颜色模式"
+#define HGLIB_OPTION_NAME_YSMS 3L
+// "黑白图像阈值"
+#define HGLIB_OPTION_NAME_HBTXYZ 4L
+// "灰度或黑白图像 - 除色"
+#define HGLIB_OPTION_NAME_HDHHBTX_CS 5L
+// "24位彩色图像 - 多流输出除红"
+#define HGLIB_OPTION_NAME_24WCSTX_DLSCCH 6L
+// "24位彩色图像 - 答题卡除红"
+#define HGLIB_OPTION_NAME_24WCSTX_DTKCH 7L
+// "背景移除"
+#define HGLIB_OPTION_NAME_BJYC 8L
+// "背景色彩浮动范围"
+#define HGLIB_OPTION_NAME_BJSCFDFW 9L
+// "锐化与模糊"
+#define HGLIB_OPTION_NAME_RHYMH 10L
+// "去除摩尔纹"
+#define HGLIB_OPTION_NAME_QCMW 11L
+// "除网纹"
+#define HGLIB_OPTION_NAME_CWW 12L
+// "错误扩散"
+#define HGLIB_OPTION_NAME_CWKS 13L
+// "黑白图像噪点优化"
+#define HGLIB_OPTION_NAME_HBTXZDYH 14L
+// "噪点优化尺寸"
+#define HGLIB_OPTION_NAME_ZDYHCC 15L
+// "纸张尺寸"
+#define HGLIB_OPTION_NAME_ZZCC 16L
+// "自定义扫描区域"
+#define HGLIB_OPTION_NAME_ZDYSMQY 17L
+// "扫描区域左侧(mm)"
+#define HGLIB_OPTION_NAME_SMQYZCmm 18L
+// "扫描区域右侧(mm)"
+#define HGLIB_OPTION_NAME_SMQYYCmm 19L
+// "扫描区域上侧(mm)"
+#define HGLIB_OPTION_NAME_SMQYSCmm 20L
+// "扫描区域下侧(mm)"
+#define HGLIB_OPTION_NAME_SMQYXCmm 21L
+// "尺寸检测"
+#define HGLIB_OPTION_NAME_CCJC 22L
+// "扫描页面"
+#define HGLIB_OPTION_NAME_SMYM 23L
+// "跳过空白页灵敏度"
+#define HGLIB_OPTION_NAME_TGKBYLMD 24L
+// "分纸强度"
+#define HGLIB_OPTION_NAME_FZQD 25L
+// "休眠时间"
+#define HGLIB_OPTION_NAME_XMSJ 26L
+// "分辨率"
+#define HGLIB_OPTION_NAME_FBL 27L
+// "画质"
+#define HGLIB_OPTION_NAME_HZ 28L
+// "交换正反面"
+#define HGLIB_OPTION_NAME_JHZFM 29L
+// "图像拆分"
+#define HGLIB_OPTION_NAME_TXCF 30L
+// "自动纠偏"
+#define HGLIB_OPTION_NAME_ZDJP 31L
+// "启用色调曲线"
+#define HGLIB_OPTION_NAME_QYSDQX 32L
+// "亮度值"
+#define HGLIB_OPTION_NAME_LDZ 33L
+// "对比度"
+#define HGLIB_OPTION_NAME_DBD 34L
+// "伽马值"
+#define HGLIB_OPTION_NAME_GMZ 35L
+// "照片模式"
+#define HGLIB_OPTION_NAME_ZPMS 36L
+// "消除黑框"
+#define HGLIB_OPTION_NAME_XCHK 37L
+// "深色样张"
+#define HGLIB_OPTION_NAME_SSYZ 38L
+// "阈值"
+#define HGLIB_OPTION_NAME_YZ 39L
+// "背景抗噪等级"
+#define HGLIB_OPTION_NAME_BJKZDJ 40L
+// "边缘缩进"
+#define HGLIB_OPTION_NAME_BYSJ 41L
+// "背景填充方式"
+#define HGLIB_OPTION_NAME_BJTCFS 42L
+// "防止渗透"
+#define HGLIB_OPTION_NAME_FZST 43L
+// "防止渗透等级"
+#define HGLIB_OPTION_NAME_FZSTDJ 44L
+// "穿孔移除—左侧"
+#define HGLIB_OPTION_NAME_CKYCZC 45L
+// #"左侧穿孔搜索范围占幅面比例"
+#define HGLIB_OPTION_NAME_ZCCKSSFWZFMBL 46L
+// "穿孔移除—右侧"
+#define HGLIB_OPTION_NAME_CKYCYC 47L
+// #"右侧穿孔搜索范围占幅面比例"
+#define HGLIB_OPTION_NAME_YCCKSSFWZFMBL 48L
+// "穿孔移除—上侧"
+#define HGLIB_OPTION_NAME_CKYCSC 49L
+// #"上侧穿孔搜索范围占幅面比例"
+#define HGLIB_OPTION_NAME_SCCKSSFWZFMBL 50L
+// "穿孔移除—下侧"
+#define HGLIB_OPTION_NAME_CKYCXC 51L
+// #"下侧穿孔搜索范围占幅面比例"
+#define HGLIB_OPTION_NAME_XCCKSSFWZFMBL 52L
+// "色彩填充"
+#define HGLIB_OPTION_NAME_SCTC 53L
+// "超声波检测"
+#define HGLIB_OPTION_NAME_CSBJC 54L
+// "双张图片处理"
+#define HGLIB_OPTION_NAME_SZTPCL 55L
+// "装订检测"
+#define HGLIB_OPTION_NAME_ZDJC 56L
+// "扫描张数"
+#define HGLIB_OPTION_NAME_SMZS 57L
+// "扫描数量"
+#define HGLIB_OPTION_NAME_SMSL 58L
+// "文稿方向"
+#define HGLIB_OPTION_NAME_WGFX 59L
+// "背面旋转180°"
+#define HGLIB_OPTION_NAME_BMXZ180 60L
+// "折角检测"
+#define HGLIB_OPTION_NAME_ZJJC 61L
+// "折角大小"
+#define HGLIB_OPTION_NAME_ZJDX 62L
+// "歪斜检测"
+#define HGLIB_OPTION_NAME_WXJC 63L
+// "歪斜容忍度"
+#define HGLIB_OPTION_NAME_WXRRD 64L
+// 自动分纸强度
+#define HGLIB_OPTION_NAME_ZDCZQD 65L
+// 进纸失败率
+#define HGLIB_OPTION_NAME_CZYZ 66L
+// 待纸扫描
+#define HGLIB_OPTION_NAME_DZSM 67L
+// 黑白图像反色输出(正常颜色为:0 - 黑色;1 - 白色)
+#define HGLIB_OPTION_NAME_HBTXFSSC 68L
+// 对折模式
+#define HGLIB_OPTION_NAME_DZMS 69L
+// 色偏校正
+#define HGLIB_OPTION_NAME_SPJZ 70L
+// 待纸扫描退出时间
+#define HGLIB_OPTION_NAME_DZSMTCSJ 71L
+// 跳过空白页
+#define HGLIB_OPTION_NAME_TGKBY 72L
+// 镜头脏污检测
+#define HGLIB_OPTION_NAME_JTZWJC 73L
+// 穿孔移除
+#define HGLIB_OPTION_NAME_CKYC 74L
+// 穿孔搜索范围占幅面比例
+#define HGLIB_OPTION_NAME_CKSSFWZFMBL 75L
+// 边界检测
+#define HGLIB_OPTION_NAME_BJJC 76L
+// 扫描传感器信号强度
+#define HGLIB_OPTION_NAME_SMCGQXHQD 77L
+// 跳过空白页边缘宽度
+#define HGLIB_OPTION_NAME_TGKBYBYKD 78L
+
+/* 配置枚举值 */
+// "无"
+#define HGLIB_OPTION_ENUMVALUE_DLSCLX_W 1L
+// "彩色+灰度+黑白"
+#define HGLIB_OPTION_ENUMVALUE_DLSCLX_CS_HD_HB 2L
+// "彩色+灰度"
+#define HGLIB_OPTION_ENUMVALUE_DLSCLX_CS_HD 3L
+// "彩色+黑白"
+#define HGLIB_OPTION_ENUMVALUE_DLSCLX_CS_HB 4L
+// "灰度+黑白"
+#define HGLIB_OPTION_ENUMVALUE_DLSCLX_HD_HB 5L
+// "24位彩色"
+#define HGLIB_OPTION_ENUMVALUE_YSMS_24WCS 6L
+// "256级灰度"
+#define HGLIB_OPTION_ENUMVALUE_YSMS_256JHD 7L
+// "黑白"
+#define HGLIB_OPTION_ENUMVALUE_YSMS_HB 8L
+// "颜色自动识别"
+#define HGLIB_OPTION_ENUMVALUE_YSMS_YSZDSB 9L
+// "不除色"
+#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_BCS 10L
+// "除红色"
+#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_CHS 11L
+// "除绿色"
+#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_CLS 12L
+// "除蓝色"
+#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_CHULANSE 13L
+// "红色增强"
+#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_HSZQ 14L
+// "绿色增强"
+#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_LSZQ 15L
+// "蓝色增强"
+#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_LANSEZENGQIANG 16L
+// "无"
+#define HGLIB_OPTION_ENUMVALUE_RHYMH_W 17L
+// "锐化"
+#define HGLIB_OPTION_ENUMVALUE_RHYMH_RH 18L
+// "进一步锐化"
+#define HGLIB_OPTION_ENUMVALUE_RHYMH_JYBRH 19L
+// "模糊"
+#define HGLIB_OPTION_ENUMVALUE_RHYMH_MH 20L
+// "进一步模糊"
+#define HGLIB_OPTION_ENUMVALUE_RHYMH_JYBMH 21L
+// "A3"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_A3 22L
+// "8开"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_8K 23L
+// "A4"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_A4 24L
+// "A4横向"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_A4HX 25L
+// "16开"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_16K 26L
+// "16开横向"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_16KHX 27L
+// "A5"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_A5 28L
+// "A5横向"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_A5HX 29L
+// "A6"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_A6 30L
+// "A6横向"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_A6HX 31L
+// "B4"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_B4 32L
+// "B5"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_B5 33L
+// "B5横向"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_B5HX 34L
+// "B6"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_B6 35L
+// "B6横向"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_B6HX 36L
+// "Letter"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_Letter 37L
+// "Letter横向"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_LetterHX 38L
+// "Double Letter"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_DoubleLetter 39L
+// "LEGAL"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_LEGAL 40L
+// "匹配原始尺寸"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_PPYSCC 41L
+// "最大扫描尺寸自动裁切"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_ZDSMCCZDCQ 42L
+// "最大扫描尺寸"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_ZDSMCC 43L
+// "三联试卷"
+#define HGLIB_OPTION_ENUMVALUE_ZZCC_SLSJ 44L
+// "单面"
+#define HGLIB_OPTION_ENUMVALUE_SMYM_DM 45L
+// "双面"
+#define HGLIB_OPTION_ENUMVALUE_SMYM_SM 46L
+// "跳过空白页(通用)"
+#define HGLIB_OPTION_ENUMVALUE_SMYM_TGKBYTY 47L
+// "跳过空白页(发票纸)"
+#define HGLIB_OPTION_ENUMVALUE_SMYM_TGKBYFPZ 48L
+// "对折"
+#define HGLIB_OPTION_ENUMVALUE_SMYM_DZ 49L
+// "无"
+#define HGLIB_OPTION_ENUMVALUE_HZ_W 50L
+// "速度优先"
+#define HGLIB_OPTION_ENUMVALUE_HZ_SDYX 51L
+// "画质优先"
+#define HGLIB_OPTION_ENUMVALUE_HZ_HZYX 52L
+// "凸多边形"
+#define HGLIB_OPTION_ENUMVALUE_BJTCFS_TDBX 53L
+// "凹多边形"
+#define HGLIB_OPTION_ENUMVALUE_BJTCFS_ADBX 54L
+// "弱"
+#define HGLIB_OPTION_ENUMVALUE_FZSTDJ_R 55L
+// "较弱"
+#define HGLIB_OPTION_ENUMVALUE_FZSTDJ_JR 56L
+// "一般"
+#define HGLIB_OPTION_ENUMVALUE_FZSTDJ_YB 57L
+// "较强"
+#define HGLIB_OPTION_ENUMVALUE_FZSTDJ_JQ 58L
+// "强"
+#define HGLIB_OPTION_ENUMVALUE_FZSTDJ_Q 59L
+// "丢弃图像并停止扫描"
+#define HGLIB_OPTION_ENUMVALUE_SZTPCL_DQTXBTZSM 60L
+// "丢弃图像并继续扫描"
+#define HGLIB_OPTION_ENUMVALUE_SZTPCL_DQTXBJXSM 61L
+// "上传图像并停止扫描"
+#define HGLIB_OPTION_ENUMVALUE_SZTPCL_SCTXBTZSM 62L
+// "上传图像并继续扫描"
+#define HGLIB_OPTION_ENUMVALUE_SZTPCL_SCTXBJXSM 63L
+// "连续扫描"
+#define HGLIB_OPTION_ENUMVALUE_SMZS_LXSM 64L
+// "扫描指定张数"
+#define HGLIB_OPTION_ENUMVALUE_SMZS_SMZDZS 65L
+// "0°"
+#define HGLIB_OPTION_ENUMVALUE_WGFX_0 66L
+// "90°"
+#define HGLIB_OPTION_ENUMVALUE_WGFX_90 67L
+// "180°"
+#define HGLIB_OPTION_ENUMVALUE_WGFX_180 68L
+// "-90°"
+#define HGLIB_OPTION_ENUMVALUE_WGFX__90 69L
+// "自动文本方向识别°"
+#define HGLIB_OPTION_ENUMVALUE_WGFX_ZDWBFXSB 70L
+// "分纸强度-弱"
+#define HGLIB_OPTION_ENUMVALUE_FZQD_R 71L
+// "分纸强度-一般"
+#define HGLIB_OPTION_ENUMVALUE_FZQD_YB 72L
+// "分纸强度-强"
+#define HGLIB_OPTION_ENUMVALUE_FZQD_Q 73L
+// "不休眠"
+#define HGLIB_OPTION_ENUMVALUE_XMSJ_BXM 74L
+// "五分钟"
+#define HGLIB_OPTION_ENUMVALUE_XMSJ_WFZ 75L
+// "十分钟"
+#define HGLIB_OPTION_ENUMVALUE_XMSJ_SFZ 76L
+// "半小时"
+#define HGLIB_OPTION_ENUMVALUE_XMSJ_BXS 77L
+// "一小时"
+#define HGLIB_OPTION_ENUMVALUE_XMSJ_YXS 78L
+// "两小时"
+#define HGLIB_OPTION_ENUMVALUE_XMSJ_LXS 79L
+// "四小时"
+#define HGLIB_OPTION_ENUMVALUE_XMSJ_SXS 80L
+// 左右对折
+#define HGLIB_OPTION_ENUMVALUE_ZYDZ 81L
+// 上下对折
+#define HGLIB_OPTION_ENUMVALUE_SXDZ 82L
+// 自动对折
+#define HGLIB_OPTION_ENUMVALUE_ZDDZ 83L
+// 待纸扫描退出时间15s
+#define HGLIB_OPTION_ENUMVALUE_DZSMTCSJ_15S 84L
+// 待纸扫描退出时间30s
+#define HGLIB_OPTION_ENUMVALUE_DZSMTCSJ_30S 85L
+// 待纸扫描退出时间60s
+#define HGLIB_OPTION_ENUMVALUE_DZSMTCSJ_60S 86L
+// 待纸扫描退出时间2min
+#define HGLIB_OPTION_ENUMVALUE_DZSMTCSJ_2MIN 87L
+// 待纸扫描退出时间4min
+#define HGLIB_OPTION_ENUMVALUE_DZSMTCSJ_4MIN 88L
+// 待纸扫描退出时间8min
+#define HGLIB_OPTION_ENUMVALUE_DZSMTCSJ_8MIN 89L
+// 跳过空白页-基于文件大小
+#define HGLIB_OPTION_ENUMVALUE_SMYM_TGKBYJYWJDX 90L
+// 上传图像并校验
+#define HGLIB_OPTION_ENUMVALUE_SZTPCL_SCTXBJY 91L
+// "正面"
+#define HGLIB_OPTION_ENUMVALUE_SMYM_ZM 93L
+// 背面
+#define HGLIB_OPTION_ENUMVALUE_SMYM_BM 94L
+
+/* 配置值类型 */
+#define HGLIB_OPTION_VALUETYPE_INT 1L
+#define HGLIB_OPTION_VALUETYPE_ENUM 2L
+#define HGLIB_OPTION_VALUETYPE_DOUBLE 3L
+#define HGLIB_OPTION_VALUETYPE_BOOL 4L
+
+/* 配置值范围类型 */
+#define HGLIB_OPTION_VALUERANGETYPE_NULL 0L
+#define HGLIB_OPTION_VALUERANGETYPE_INTLIST 1L
+#define HGLIB_OPTION_VALUERANGETYPE_ENUMLIST 2L
+#define HGLIB_OPTION_VALUERANGETYPE_DOUBLELIST 3L
+#define HGLIB_OPTION_VALUERANGETYPE_INTRANGE 4L
+#define HGLIB_OPTION_VALUERANGETYPE_DOUBLERANGE 5L
+
+#pragma pack(push)
+#pragma pack(4)
+
+typedef struct
+{
+ HGUInt size; /* 结构体大小,必须初始化为sizeof(HGLibSaveImageParam) */
+ HGUInt jpegQuality; /* jpeg下有效, 0-100 */
+ HGUInt tiffCompression; /* tiff下有效, HGLIB_TIFFCOMPRESSION_* */
+ HGUInt tiffJpegQuality; /* tiff且HGLIB_TIFFCOMPRESSION_JPEG下有效, 0-100 */
+ HGBool ocr; /* 是否OCR,pdf和ofd格式有效 */
+ HGFloat jp2Ratio; /* jp2压缩比 */
+}HGLibSaveImageParam;
+
+/* 图像信息 */
+typedef struct
+{
+ HGUInt width; /* 宽(像素),列数 */
+ HGUInt height; /* 高(像素),行数 */
+ HGUInt type; /* 类型,参见HGLIB_IMGTYPE_* */
+ HGUInt widthStep; /* 每行的字节数 */
+ HGUInt origin; /* 数据排列方式,参见HGLIB_IMGORIGIN_* */
+}HGLibImageInfo;
+
+typedef struct
+{
+ HGInt* value;
+ HGUInt count;
+}HGLibDeviceIntValueList;
+
+typedef struct
+{
+ HGUInt* value;
+ HGUInt count;
+}HGLibDeviceEnumValueList;
+
+typedef struct
+{
+ HGDouble* value;
+ HGUInt count;
+}HGLibDeviceDoubleValueList;
+
+typedef struct
+{
+ HGInt minValue;
+ HGInt maxValue;
+}HGLibDeviceIntValueRange;
+
+typedef struct
+{
+ HGDouble minValue;
+ HGDouble maxValue;
+}HGLibDeviceDoubleValueRange;
+
+typedef struct
+{
+ HGUInt option; /* 配置名, 参见HGLIB_OPTION_NAME_* */
+
+ HGUInt type; /* 值类型, 参见HGLIB_OPTION_VALUETYPE_* */
+ union
+ {
+ HGInt intValue;
+ HGUInt enumValue;
+ HGDouble doubleValue;
+ HGBool boolValue;
+ };
+
+ HGUInt rangeType; /* 值范围类型, 参见HGLIB_OPTION_VALUERANGETYPE_* */
+ union
+ {
+ HGLibDeviceIntValueList intValueList;
+ HGLibDeviceEnumValueList enumValueList;
+ HGLibDeviceDoubleValueList doubleValueList;
+ HGLibDeviceIntValueRange intValueRange;
+ HGLibDeviceDoubleValueRange doubleValueRange;
+ };
+}HGLibDeviceParam;
+
+typedef struct
+{
+ HGUInt group; /* 组名, 参见HGLIB_GROUP_NAME_* */
+ HGLibDeviceParam* param;
+ HGUInt paramCount;
+}HGLibDeviceParamGroup;
+
+#pragma pack(pop)
+
+/* 设备热拔插回调
+* event: HGLIB_DEVHOTPLUG_EVENT_*
+* deviceName: 设备名
+* param: 回调参数
+*/
+typedef void (HGAPI *HGLibDeviceHotPlugEventFunc)(HGUInt event, const HGChar *deviceName, HGPointer param);
+
+/* 设备扫描事件回调
+* device: 设备句柄
+* event: HGLIB_DEVSCAN_EVENT_*
+* operateCode: 设备错误码, HGLIB_DEVSCAN_EVENT_INFO下有效
+* info: 扫描信息, HGLIB_DEVSCAN_EVENT_INFO下有效
+* param: 回调参数
+*/
+typedef void (HGAPI *HGLibDeviceScanEventFunc)(HGLibDevice device, HGUInt event, HGInt operateCode, const HGChar *info, HGPointer param);
+
+/* 设备扫描图像回调
+* device: 设备句柄
+* image: 图像句柄, 不要调用HGLib_ReleaseImage释放, 回调执行后会自动释放
+* param: 回调参数
+*/
+typedef void (HGAPI *HGLibDeviceScanImageFunc)(HGLibDevice device, HGLibImage image, HGPointer param);
+
+/* 内存拷贝 */
+HGEXPORT HGBool HGAPI HGLib_MemoryCopy(HGVoid *dest, const HGVoid *src, HGUInt size);
+
+/* 加载图像 */
+HGEXPORT HGLibImage HGAPI HGLib_LoadImage(const HGChar *filePath);
+
+/* 克隆图像 */
+HGEXPORT HGLibImage HGAPI HGLib_CloneImage(HGLibImage image, HGUInt type, HGUInt origin);
+
+/* 获取图像数据 */
+HGEXPORT HGByte* HGAPI HGLib_GetImageData(HGLibImage image);
+
+/* 获取图像信息 */
+HGEXPORT HGBool HGAPI HGLib_GetImageInfo(HGLibImage image, HGLibImageInfo* imageInfo);
+
+/* 获取图像DPI */
+HGEXPORT HGBool HGAPI HGLib_GetImageDpi(HGLibImage image, HGUInt *xDpi, HGUInt *yDpi);
+
+/* 保存图像 */
+HGEXPORT HGBool HGAPI HGLib_SaveImage(HGLibImage image, const HGChar* savePath, const HGLibSaveImageParam* saveParam);
+
+/* 释放图像 */
+HGEXPORT HGBool HGAPI HGLib_ReleaseImage(HGLibImage image);
+
+/* 获取OCR文本 */
+HGEXPORT HGChar* HGAPI HGLib_GetOcrText(HGLibImage image);
+
+/* 销毁OCR文本 */
+HGEXPORT HGBool HGAPI HGLib_ReleaseOcrText(HGChar* ocrText);
+
+/* 初始化扫描仪 */
+HGEXPORT HGBool HGAPI HGLib_InitDevice(HGLibDeviceHotPlugEventFunc func, HGPointer param);
+
+/* 反初始化扫描仪 */
+HGEXPORT HGBool HGAPI HGLib_DeinitDevice();
+
+/* 获取扫描仪名称列表 */
+HGEXPORT HGChar** HGAPI HGLib_GetDeviceNameList();
+
+/* 销毁扫描仪名称列表 */
+HGEXPORT HGBool HGAPI HGLib_ReleaseDeviceNameList(HGChar** deviceName);
+
+/* 打开设备 */
+HGEXPORT HGLibDevice HGAPI HGLib_OpenDevice(const HGChar *deviceName);
+
+/* 关闭设备 */
+HGEXPORT HGBool HGAPI HGLib_CloseDevice(HGLibDevice device);
+
+/* 获取设备型号 */
+HGEXPORT HGBool HGAPI HGLib_GetDeviceType(HGLibDevice device, HGChar *type, HGUInt maxLen);
+
+/* 获取设备序列号 */
+HGEXPORT HGBool HGAPI HGLib_GetDeviceSN(HGLibDevice device, HGChar *sn, HGUInt maxLen);
+
+/* 获取设备固件版本号*/
+HGEXPORT HGBool HGAPI HGLib_GetDeviceFWVersion(HGLibDevice device, HGChar* fwVersion, HGUInt maxLen);
+
+/* 获取设备生产日期 */
+HGEXPORT HGBool HGAPI HGLib_GetDevicePD(HGLibDevice device, HGChar* pd, HGUInt maxLen);
+
+/* 获取生产批次号 */
+HGEXPORT HGBool HGAPI HGLib_GetDevicePatchId(HGLibDevice device, HGChar* patchId, HGUInt maxLen);
+
+/* 获取设备滚轴计数 */
+HGEXPORT HGInt HGAPI HGLib_GetDeviceRollerCount(HGLibDevice device);
+
+/* 获取设备历史扫描张数 */
+HGEXPORT HGInt HGAPI HGLib_GetDeviceTotalCount(HGLibDevice device);
+
+/* 清除滚轴计数 */
+HGEXPORT HGBool HGAPI HGLib_ClearDeviceRollerCount(HGLibDevice device);
+
+/* 设置设备锁定令牌 */
+HGEXPORT HGBool HGAPI HGLib_SetDeviceToken(HGLibDevice device, const HGChar *code);
+
+/* 设置是否获取原图 */
+HGEXPORT HGBool HGAPI HGLib_SetOriginalImage(HGLibDevice device, HGBool isOriginal);
+
+/* 设置设备参数 */
+HGEXPORT HGBool HGAPI HGLib_SetDeviceParam(HGLibDevice device, HGUInt option, const HGVoid *data);
+
+/* 获取设备参数 */
+HGEXPORT HGLibDeviceParamGroup* HGAPI HGLib_GetDeviceParamGroupList(HGLibDevice device, HGUInt *count);
+HGEXPORT HGLibDeviceParam* HGAPI HGLib_GetDeviceParam(HGLibDevice device, HGUInt option);
+
+/* 销毁设备参数 */
+HGEXPORT HGBool HGAPI HGLib_ReleaseDeviceParamGroupList(HGLibDeviceParamGroup* paramGroup, HGUInt count);
+HGEXPORT HGBool HGAPI HGLib_ReleaseDeviceParam(HGLibDeviceParam* param);
+
+/* 重置设备参数 */
+HGEXPORT HGBool HGAPI HGLib_ResetDeviceParam(HGLibDevice device);
+
+/* 设备是否有纸 */
+HGEXPORT HGBool HGAPI HGLib_DeviceIsPaperOn(HGLibDevice device);
+
+/* 获取设备状态 */
+HGEXPORT HGInt HGAPI HGLib_GetDeviceStatus(HGLibDevice device);
+
+/* 获取设备是否在线 */
+HGEXPORT HGBool HGAPI HGLib_GetDeviceIsOnline(HGLibDevice device);
+
+/* 重启设备 */
+HGEXPORT HGBool HGAPI HGLib_DeviceRestart(HGLibDevice device);
+
+/* 关闭设备 */
+HGEXPORT HGBool HGAPI HGLib_DeviceShutDown(HGLibDevice device);
+
+/* 开始扫描 */
+HGEXPORT HGBool HGAPI HGLib_StartDeviceScan(HGLibDevice device, HGLibDeviceScanEventFunc eventFunc, HGPointer eventParam,
+ HGLibDeviceScanImageFunc imageFunc, HGPointer imageParam);
+
+/* 停止扫描 */
+HGEXPORT HGBool HGAPI HGLib_StopDeviceScan(HGLibDevice device);
+
+/* 停止扫描-异步 */
+HGEXPORT HGBool HGAPI HGLib_StopDeviceScanAsyn(HGLibDevice device);
+
+/* 获取设备错误码(在调用设备操作函数以后) */
+HGEXPORT HGInt HGAPI HGLib_GetDeviceOperateCode(HGLibDevice device);
+
+/* 获取当前图像所属的页码序号(必须在HGLibDeviceScanImageFunc回调中调用) */
+HGEXPORT HGInt HGAPI HGLib_GetDevicePageId(HGLibDevice device);
+
+#endif /* __HGSCANNERLIB_H__ */