twain增加双张保留机制

This commit is contained in:
yangjiaxuan 2023-10-08 15:19:23 +08:00
parent 222fcce06b
commit eee1ca5a02
16 changed files with 3078 additions and 152 deletions

View File

@ -225,7 +225,6 @@ SOURCES += \
../../../app/scanner2/dialog_updateprogress.cpp \
../../../app/scanner2/dialog_upgrade.cpp \
../../../app/scanner2/dialog_writesettings.cpp \
../../../app/scanner2/dialog_wrong_img.cpp \
../../../app/scanner2/dialog_waitingocr.cpp \
../../../app/scanner2/device_user.cpp \
../../../app/scanner2/graphicsscene.cpp \
@ -266,7 +265,6 @@ HEADERS += \
../../../app/scanner2/dialog_updateprogress.h \
../../../app/scanner2/dialog_upgrade.h \
../../../app/scanner2/dialog_writesettings.h \
../../../app/scanner2/dialog_wrong_img.h \
../../../app/scanner2/dialog_waitingocr.h \
../../../app/scanner2/device_user.h \
../../../app/scanner2/graphicsscene.h \
@ -301,7 +299,6 @@ FORMS += \
../../../app/scanner2/dialog_updateprogress.ui \
../../../app/scanner2/dialog_upgrade.ui \
../../../app/scanner2/dialog_writesettings.ui \
../../../app/scanner2/dialog_wrong_img.ui \
../../../app/scanner2/dialog_waitingocr.ui \
../../../app/scanner2/mainwindow.ui \
../../../app/scanner2/widget_imgproc_base.ui \

View File

@ -14,3 +14,4 @@ show_twain_srclist_ui
show_srclist_ui
close_ui
pump_ui_message
abnormal_image

View File

@ -183,6 +183,8 @@ SOURCES += ../../../modules/twainui/twainui.cpp
HEADERS += ../../../modules/twainui/twainui.h
SOURCES += ../../../modules/twainui/hg_settingdialog.cpp
HEADERS += ../../../modules/twainui/hg_settingdialog.h
SOURCES += ../../../modules/twainui/HGImgView.cpp
HEADERS += ../../../modules/twainui/HGImgView.h
SOURCES += \
../../../modules/twainui/app_cfg.cpp \
@ -202,7 +204,8 @@ SOURCES += \
../../../modules/twainui/dialog_progress_ui.cpp \
../../../modules/twainui/dialog_device_select.cpp \
../../../modules/twainui/dialog_twain_source_select.cpp \
../../../modules/twainui/dialog_source_select.cpp
../../../modules/twainui/dialog_source_select.cpp \
../../../modules/twainui/dialog_abnormal_img_select.cpp
HEADERS += \
../../../modules/twainui/app_cfg.h \
@ -221,7 +224,8 @@ HEADERS += \
../../../modules/twainui/dialog_progress_ui.h \
../../../modules/twainui/dialog_device_select.h \
../../../modules/twainui/dialog_twain_source_select.h \
../../../modules/twainui/dialog_source_select.h
../../../modules/twainui/dialog_source_select.h \
../../../modules/twainui/dialog_abnormal_img_select.h
FORMS += \
../../../modules/twainui/cutdialog.ui \
@ -232,7 +236,8 @@ FORMS += \
../../../modules/twainui/dialog_progress_ui.ui \
../../../modules/twainui/dialog_device_select.ui \
../../../modules/twainui/dialog_twain_source_select.ui \
../../../modules/twainui/dialog_source_select.ui
../../../modules/twainui/dialog_source_select.ui \
../../../modules/twainui/dialog_abnormal_img_select.ui
RESOURCES += \
../../../modules/twainui/TwainUI_resource.qrc

File diff suppressed because it is too large Load Diff

148
modules/twainui/HGImgView.h Normal file
View File

@ -0,0 +1,148 @@
#ifndef __HGIMGVIEW_H__
#define __HGIMGVIEW_H__
#include "base/HGDef.h"
#include "base/HGBaseErr.h"
#include "base/HGImage.h"
#include <QWidget>
class HGImgView : public QWidget
{
Q_OBJECT
public:
HGImgView(QWidget* parent = nullptr);
virtual ~HGImgView();
HGResult setScrollSize(int size);
HGResult setMinScrollSliderSize(int size);
HGResult setHScrollLeftImage(const QImage *normalImage, const QImage *hotImage, const QImage *pushImage);
HGResult setHScrollRightImage(const QImage *normalImage, const QImage *hotImage, const QImage *pushImage);
HGResult setVScrollTopImage(const QImage *normalImage, const QImage *hotImage, const QImage *pushImage);
HGResult setVScrollBottomImage(const QImage *normalImage, const QImage *hotImage, const QImage *pushImage);
HGResult setHScrollImage(const QImage *image, const HGRect *stretch);
HGResult setHScrollSliderImage(const QImage *normalImage, const HGRect *normalStretch, const QImage *hotImage, const HGRect *hotStretch,
const QImage *pushImage, const HGRect *pushStretch);
HGResult setVScrollImage(const QImage *image, const HGRect *stretch);
HGResult setVScrollSliderImage(const QImage *normalImage, const HGRect *normalStretch, const QImage *hotImage, const HGRect *hotStretch,
const QImage *pushImage, const HGRect *pushStretch);
HGResult setNullScrollImage(const QImage *image);
HGResult enableScroll(bool enable);
HGResult addImage(HGImage image);
HGResult clearImage();
HGResult getImage(HGImage *image);
HGResult enableHighQuality(bool enable);
HGResult rotateLeft();
HGResult rotateRight();
HGResult rotate180();
HGResult zoomIn(const HGPoint *pCenter);
HGResult zoomOut(const HGPoint *pCenter);
HGResult realSize();
HGResult fitWndSize();
HGResult fitWndWidth();
HGResult showColorInfo(bool show);
signals:
void escape();
void doubleClicked();
void mousePos(int x, int y);
void scaleChanged(double scale);
void drop(const QObject *source, const QStringList &fileNames);
private:
enum MouseStatus
{
MouseStatus_Null = 0,
MouseStatus_HScroll,
MouseStatus_HScrollSlider,
MouseStatus_HScrollLeft,
MouseStatus_HScrollRight,
MouseStatus_VScroll,
MouseStatus_VScrollSlider,
MouseStatus_VScrollTop,
MouseStatus_VScrollBottom,
MouseStatus_NullScroll
};
protected:
virtual void mousePressEvent(QMouseEvent *e);
virtual void mouseMoveEvent(QMouseEvent* e);
virtual void mouseReleaseEvent(QMouseEvent *e);
virtual void enterEvent(QEvent *e);
virtual void leaveEvent(QEvent *e);
virtual void paintEvent(QPaintEvent* e);
virtual void wheelEvent(QWheelEvent* e);
virtual void resizeEvent(QResizeEvent* e);
virtual void keyPressEvent(QKeyEvent *e);
virtual void dragEnterEvent(QDragEnterEvent *e);
virtual void dragMoveEvent(QDragMoveEvent *e);
virtual void dragLeaveEvent(QDragLeaveEvent *e);
virtual void dropEvent(QDropEvent *e);
virtual void mouseDoubleClickEvent(QMouseEvent* e);
private:
static void GetMinShowImageRect(const HGRect *pWnd, int nImgWidth, int nImgHeight, bool &bShowImage, HGRectF &rcShowImage);
static void ResizeShowImageRect(bool &bShowImage, HGRectF &rcShowImage, float fNewWidth, float fNewHeight, const HGPoint *pCenter);
static void recalcShowRect(int wndWidth, int wndHeight, int scrollSize, bool hScroll, bool vScroll, bool showImage, HGRectF &imageRect);
static void DrawImage(QPainter &painter, const QRect &destRect, const QImage *image, const QRect &stretchRect);
QImage* createQImage();
void DrawScroll(QPainter &painter);
void reset();
void updateMoveStatusAndCursor();
MouseStatus getMouseStatus(const QPoint &pt);
QRect getHScrollLeftPos();
QRect getHScrollRightPos();
QRect getHScrollPos();
QRect getHScrollSliderPos();
QRect getVScrollTopPos();
QRect getVScrollBottomPos();
QRect getVScrollPos();
QRect getVScrollSliderPos();
QRect getNullScrollPos();
void Show();
private:
int m_scrollSize;
int m_minScrollSliderSize;
QImage *m_hScrollLeftImage[3];
QImage *m_hScrollRightImage[3];
QImage *m_vScrollTopImage[3];
QImage *m_vScrollBottomImage[3];
QImage *m_hScrollImage;
QRect m_hScrollImageStretch;
QImage *m_hScrollSliderImage[3];
QRect m_hScrollSliderImageStretch[3];
QImage *m_vScrollImage;
QRect m_vScrollImageStretch;
QImage *m_vScrollSliderImage[3];
QRect m_vScrollSliderImageStretch[3];
QImage *m_nullScrollImage;
bool m_enableScroll;
bool m_mouseOn;
bool m_hScroll;
bool m_vScroll;
HGImage m_image;
QImage *m_qImage;
bool m_showImage;
HGRectF m_showRect;
bool m_enableHighQuality;
MouseStatus m_mouseMoveStatus;
MouseStatus m_mousePressStatus;
int m_mousePressBeginX;
int m_mousePressBeginY;
bool m_showColorInfo;
int m_operate;
int m_beginX;
int m_beginY;
bool m_draging;
};
#endif /* __HGIMGVIEW_HPP__ */

View File

@ -5,6 +5,9 @@
#endif
#include "lang/app_language.h"
#include <locale.h>
#include <QMetaType>
Q_DECLARE_METATYPE(HGImage)
extern Manager* g_manager;
@ -19,6 +22,8 @@ Manager::Manager()
{
HGBase_CreateEvent(HGFALSE, HGFALSE, &m_event);
qRegisterMetaType<HGImage>("HGImage");
connect(this, SIGNAL(init()), this, SLOT(on_init()));
connect(this, SIGNAL(createDeviceSelect(bool)), this, SLOT(on_createDeviceSelect(bool)));
connect(this, SIGNAL(createSettingUi(bool)), this, SLOT(on_createSettingUi(bool)));
@ -26,6 +31,7 @@ Manager::Manager()
connect(this, SIGNAL(createMessageBoxUi(bool)), this, SLOT(on_createMessageBoxUi(bool)));
connect(this, SIGNAL(createTwainSrcUi(bool)), this, SLOT(on_createTwainSrcUi(bool)));
connect(this, SIGNAL(createSaneSrcUi(bool)), this, SLOT(on_createSaneSrcUi(bool)));
connect(this, SIGNAL(createAbnormalImgUi(bool, HGImage)), this, SLOT(on_createAbnormalImgUi(bool, HGImage)), Qt::BlockingQueuedConnection);
connect(this, SIGNAL(deleteSettingUi()), this, SLOT(on_deleteSettingUi()));
connect(this, SIGNAL(deleteProgressUi()), this, SLOT(on_deleteProgressUi()));
@ -210,6 +216,48 @@ int Manager::showSaneSrcUi(bool qt, const char **manuNames, const char **sanePat
return 0;
}
int Manager::showAbnormalImgUi(bool qt, SANE_Image *img)
{
HGUInt imgType = 0;
if (img->header.format == SANE_FRAME_GRAY)
{
if (1 == img->header.depth)
imgType = HGBASE_IMGTYPE_BINARY;
else if (8 == img->header.depth)
imgType = HGBASE_IMGTYPE_GRAY;
}
else if (img->header.format == SANE_FRAME_RGB)
{
imgType = HGBASE_IMGTYPE_RGB;
}
HGImageInfo imgInfo = { (HGUInt)img->header.pixels_per_line, (HGUInt)img->header.lines,
imgType, (HGUInt)img->header.bytes_per_line, HGBASE_IMGORIGIN_TOP };
HGImage image = NULL;
HGBase_CreateImageWithData(img->data, &imgInfo, &image);
#ifdef HG_CMP_MSC
m_abnormalImgThreadId = GetCurrentThreadId();
#endif
emit createAbnormalImgUi(qt, image);
#ifdef HG_CMP_MSC
if (!qt)
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
#endif
return m_abnormalImgResult;
}
void Manager::closeSettingUi()
{
emit deleteSettingUi();
@ -421,6 +469,25 @@ void Manager::on_createSaneSrcUi(bool qt)
#endif
}
void Manager::on_createAbnormalImgUi(bool qt, HGImage image)
{
Dialog_abnormal_img_select* dlg = nullptr;
if (m_progressUi != nullptr)
dlg = new Dialog_abnormal_img_select(image, m_progressUi);
else
dlg = new Dialog_abnormal_img_select(image);
dlg->exec();
m_abnormalImgResult = dlg->getUserSelect();
#ifdef HG_CMP_MSC
if (!qt)
{
::PostThreadMessage(m_abnormalImgThreadId, WM_QUIT, 0, 0);
}
#endif
}
void Manager::on_deleteSettingUi()
{
if (m_settingUi != nullptr)

View File

@ -7,6 +7,7 @@
#include "dialog_progress_ui.h"
#include "dialog_twain_source_select.h"
#include "dialog_source_select.h"
#include "dialog_abnormal_img_select.h"
class Manager : public QObject
{
@ -23,6 +24,7 @@ public:
int showTwainSrcUi(bool qt, const TW_IDENTITY *vds, HGUInt count, const char* defDevName, HGWindow parent, TW_IDENTITY *ds);
int showSaneSrcUi(bool qt, const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll,
SANEAPI* saneApi, char *manuName, unsigned int maxLen);
int showAbnormalImgUi(bool qt, SANE_Image *img);
void closeSettingUi();
void closeProgressUi();
@ -38,6 +40,7 @@ signals:
void createMessageBoxUi(bool qt);
void createTwainSrcUi(bool qt);
void createSaneSrcUi(bool qt);
void createAbnormalImgUi(bool qt, HGImage image);
void deleteSettingUi();
void deleteProgressUi();
@ -52,6 +55,7 @@ private slots:
void on_createMessageBoxUi(bool qt);
void on_createTwainSrcUi(bool qt);
void on_createSaneSrcUi(bool qt);
void on_createAbnormalImgUi(bool qt, HGImage image);
void on_deleteSettingUi();
void on_deleteProgressUi();
@ -115,4 +119,9 @@ public:
HGDll m_saneDll;
SANEAPI m_saneApi;
std::string m_saneManuName;
#ifdef HG_CMP_MSC
unsigned long m_abnormalImgThreadId;
#endif
int m_abnormalImgResult;
};

Binary file not shown.

View File

@ -1501,6 +1501,24 @@ Please make sure the two passwords are the same.</source>
<translation type="vanished"></translation>
</message>
</context>
<context>
<name>Dialog_abnormal_img_select</name>
<message>
<location filename="dialog_abnormal_img_select.ui" line="14"/>
<source>Dialog</source>
<translation></translation>
</message>
<message>
<location filename="dialog_abnormal_img_select.ui" line="43"/>
<source>Reserve</source>
<translation></translation>
</message>
<message>
<location filename="dialog_abnormal_img_select.ui" line="50"/>
<source>Discard</source>
<translation></translation>
</message>
</context>
<context>
<name>Dialog_device_select</name>
<message>
@ -1563,12 +1581,12 @@ Please make sure the two passwords are the same.</source>
<translation>:%1</translation>
</message>
<message>
<location filename="dialog_progress_ui.cpp" line="151"/>
<location filename="dialog_progress_ui.cpp" line="158"/>
<source>Start scan...</source>
<translation>...</translation>
</message>
<message>
<location filename="dialog_progress_ui.cpp" line="158"/>
<location filename="dialog_progress_ui.cpp" line="174"/>
<source>Scan completed</source>
<translation></translation>
</message>
@ -2662,7 +2680,7 @@ Are you sure to close?</source>
<context>
<name>Manager</name>
<message>
<location filename="Manager.cpp" line="353"/>
<location filename="Manager.cpp" line="402"/>
<source>Prompt</source>
<translation></translation>
</message>
@ -2839,7 +2857,7 @@ Are you sure to close?</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="342"/>
<location filename="hg_settingdialog.cpp" line="350"/>
<source>existing configuration scheme</source>
<translation></translation>
</message>
@ -2864,152 +2882,152 @@ Are you sure to close?</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="384"/>
<location filename="hg_settingdialog.cpp" line="2859"/>
<location filename="hg_settingdialog.cpp" line="392"/>
<location filename="hg_settingdialog.cpp" line="2909"/>
<source>The current parameter settings are inconsistent with the configuration scheme &apos;%1&apos;. To use the configuration scheme &apos;%1&apos; parameters, please click the restore button</source>
<translation> %1 使 %1 </translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="430"/>
<location filename="hg_settingdialog.cpp" line="438"/>
<source>about...</source>
<translation>...</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="432"/>
<location filename="hg_settingdialog.cpp" line="440"/>
<source>scan</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="434"/>
<location filename="hg_settingdialog.cpp" line="2125"/>
<location filename="hg_settingdialog.cpp" line="442"/>
<location filename="hg_settingdialog.cpp" line="2175"/>
<source>ok</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="437"/>
<location filename="hg_settingdialog.cpp" line="445"/>
<source>cancel</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="463"/>
<location filename="hg_settingdialog.cpp" line="471"/>
<source>configuration scheme management</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="509"/>
<location filename="hg_settingdialog.cpp" line="517"/>
<source>regional crop</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="529"/>
<location filename="hg_settingdialog.cpp" line="537"/>
<source>custom tone curve</source>
<translation>线</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1157"/>
<location filename="hg_settingdialog.cpp" line="1196"/>
<location filename="hg_settingdialog.cpp" line="1258"/>
<location filename="hg_settingdialog.cpp" line="1283"/>
<location filename="hg_settingdialog.cpp" line="1300"/>
<location filename="hg_settingdialog.cpp" line="1540"/>
<location filename="hg_settingdialog.cpp" line="1621"/>
<location filename="hg_settingdialog.cpp" line="1707"/>
<location filename="hg_settingdialog.cpp" line="1768"/>
<location filename="hg_settingdialog.cpp" line="1191"/>
<location filename="hg_settingdialog.cpp" line="1230"/>
<location filename="hg_settingdialog.cpp" line="1292"/>
<location filename="hg_settingdialog.cpp" line="1317"/>
<location filename="hg_settingdialog.cpp" line="1350"/>
<location filename="hg_settingdialog.cpp" line="1590"/>
<location filename="hg_settingdialog.cpp" line="1671"/>
<location filename="hg_settingdialog.cpp" line="1757"/>
<location filename="hg_settingdialog.cpp" line="1818"/>
<source>Prompt</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1157"/>
<location filename="hg_settingdialog.cpp" line="1258"/>
<location filename="hg_settingdialog.cpp" line="1300"/>
<location filename="hg_settingdialog.cpp" line="1540"/>
<location filename="hg_settingdialog.cpp" line="1621"/>
<location filename="hg_settingdialog.cpp" line="1707"/>
<location filename="hg_settingdialog.cpp" line="1768"/>
<location filename="hg_settingdialog.cpp" line="1191"/>
<location filename="hg_settingdialog.cpp" line="1292"/>
<location filename="hg_settingdialog.cpp" line="1350"/>
<location filename="hg_settingdialog.cpp" line="1590"/>
<location filename="hg_settingdialog.cpp" line="1671"/>
<location filename="hg_settingdialog.cpp" line="1757"/>
<location filename="hg_settingdialog.cpp" line="1818"/>
<source>The funtion is unsupported</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1196"/>
<location filename="hg_settingdialog.cpp" line="1283"/>
<location filename="hg_settingdialog.cpp" line="1230"/>
<location filename="hg_settingdialog.cpp" line="1317"/>
<source>This function may cause a decrease in the speed of drawing.</source>
<translation>.</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1817"/>
<location filename="hg_settingdialog.cpp" line="1867"/>
<source>about </source>
<translation> </translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1822"/>
<location filename="hg_settingdialog.cpp" line="1830"/>
<location filename="hg_settingdialog.cpp" line="1838"/>
<location filename="hg_settingdialog.cpp" line="1846"/>
<location filename="hg_settingdialog.cpp" line="1855"/>
<location filename="hg_settingdialog.cpp" line="1868"/>
<location filename="hg_settingdialog.cpp" line="1882"/>
<location filename="hg_settingdialog.cpp" line="1872"/>
<location filename="hg_settingdialog.cpp" line="1880"/>
<location filename="hg_settingdialog.cpp" line="1888"/>
<location filename="hg_settingdialog.cpp" line="1896"/>
<location filename="hg_settingdialog.cpp" line="1905"/>
<location filename="hg_settingdialog.cpp" line="1918"/>
<location filename="hg_settingdialog.cpp" line="1932"/>
<source>Not supported</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1825"/>
<location filename="hg_settingdialog.cpp" line="1875"/>
<source>&lt;p&gt;Device model: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1833"/>
<location filename="hg_settingdialog.cpp" line="1883"/>
<source>&lt;p&gt;Driver version: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1841"/>
<location filename="hg_settingdialog.cpp" line="1891"/>
<source>&lt;p&gt;Firmware number: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1849"/>
<location filename="hg_settingdialog.cpp" line="1899"/>
<source>&lt;p&gt;Serial number: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1857"/>
<location filename="hg_settingdialog.cpp" line="1862"/>
<location filename="hg_settingdialog.cpp" line="1870"/>
<location filename="hg_settingdialog.cpp" line="1907"/>
<location filename="hg_settingdialog.cpp" line="1912"/>
<source>&lt;p&gt;Roller count: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1875"/>
<location filename="hg_settingdialog.cpp" line="1920"/>
<location filename="hg_settingdialog.cpp" line="1925"/>
<source>&lt;p&gt;History count: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1885"/>
<location filename="hg_settingdialog.cpp" line="1935"/>
<source>&lt;p&gt;Initial startup time: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2076"/>
<location filename="hg_settingdialog.cpp" line="2126"/>
<source>Please select to overwrite the original configuration:</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2078"/>
<location filename="hg_settingdialog.cpp" line="2128"/>
<source>,or add a new configuration</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2081"/>
<location filename="hg_settingdialog.cpp" line="2131"/>
<source>save the configuration</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3001"/>
<location filename="hg_settingdialog.cpp" line="3051"/>
<source>Add new scheme</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3011"/>
<location filename="hg_settingdialog.cpp" line="3061"/>
<source>The configuration scheme already exists</source>
<translation></translation>
</message>
@ -3047,7 +3065,7 @@ No: add new configuration</oldsource>
<translation type="vanished">&lt;h6&gt;&lt;b&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2086"/>
<location filename="hg_settingdialog.cpp" line="2136"/>
<source>cover original configuration:</source>
<translation></translation>
</message>
@ -3056,22 +3074,22 @@ No: add new configuration</oldsource>
<translation type="vanished"></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="349"/>
<location filename="hg_settingdialog.cpp" line="357"/>
<source>Add new</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="357"/>
<location filename="hg_settingdialog.cpp" line="365"/>
<source>Save</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="365"/>
<location filename="hg_settingdialog.cpp" line="373"/>
<source>Delete</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="374"/>
<location filename="hg_settingdialog.cpp" line="382"/>
<source>Delete all</source>
<translation></translation>
</message>
@ -3081,39 +3099,39 @@ No: add new configuration</oldsource>
<translation type="vanished"> %1 使 %1 </translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="389"/>
<location filename="hg_settingdialog.cpp" line="397"/>
<source>Restore</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2090"/>
<location filename="hg_settingdialog.cpp" line="2140"/>
<source>add new configuration</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2094"/>
<location filename="hg_settingdialog.cpp" line="2144"/>
<source>rename:</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2136"/>
<location filename="hg_settingdialog.cpp" line="2150"/>
<location filename="hg_settingdialog.cpp" line="3011"/>
<location filename="hg_settingdialog.cpp" line="2186"/>
<location filename="hg_settingdialog.cpp" line="2200"/>
<location filename="hg_settingdialog.cpp" line="3061"/>
<source>tips</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2136"/>
<location filename="hg_settingdialog.cpp" line="2186"/>
<source>scheme name cannot be empty</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2150"/>
<location filename="hg_settingdialog.cpp" line="2200"/>
<source>scheme name: </source>
<translation> </translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2150"/>
<location filename="hg_settingdialog.cpp" line="2200"/>
<source> already exists</source>
<translation> </translation>
</message>
@ -3134,18 +3152,18 @@ No: add new configuration</oldsource>
<translation type="vanished"></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3064"/>
<location filename="hg_settingdialog.cpp" line="3086"/>
<location filename="hg_settingdialog.cpp" line="3114"/>
<location filename="hg_settingdialog.cpp" line="3136"/>
<source>be sure to delete the configuration</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3065"/>
<location filename="hg_settingdialog.cpp" line="3115"/>
<source>Are you sure you want to delete the configuration &quot;</source>
<translation></translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3065"/>
<location filename="hg_settingdialog.cpp" line="3115"/>
<source>&quot; ?</source>
<translation></translation>
</message>
@ -3158,7 +3176,7 @@ No: add new configuration</oldsource>
<translation type="vanished"> </translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3087"/>
<location filename="hg_settingdialog.cpp" line="3137"/>
<source>Are you sure you want to delete the configuration?</source>
<translation></translation>
</message>

Binary file not shown.

View File

@ -1378,6 +1378,24 @@ Please make sure the two passwords are the same.</source>
<translation type="vanished">High</translation>
</message>
</context>
<context>
<name>Dialog_abnormal_img_select</name>
<message>
<location filename="dialog_abnormal_img_select.ui" line="14"/>
<source>Dialog</source>
<translation>Abnormal image</translation>
</message>
<message>
<location filename="dialog_abnormal_img_select.ui" line="43"/>
<source>Reserve</source>
<translation>Reserve image</translation>
</message>
<message>
<location filename="dialog_abnormal_img_select.ui" line="50"/>
<source>Discard</source>
<translation>Discard image</translation>
</message>
</context>
<context>
<name>Dialog_device_select</name>
<message>
@ -1440,12 +1458,12 @@ Please make sure the two passwords are the same.</source>
<translation>Total scanned images: %1</translation>
</message>
<message>
<location filename="dialog_progress_ui.cpp" line="151"/>
<location filename="dialog_progress_ui.cpp" line="158"/>
<source>Start scan...</source>
<translation>Start scan...</translation>
</message>
<message>
<location filename="dialog_progress_ui.cpp" line="158"/>
<location filename="dialog_progress_ui.cpp" line="174"/>
<source>Scan completed</source>
<translation>Scan completed</translation>
</message>
@ -2366,7 +2384,7 @@ Please go to “Scan to” and change the accessible scan folder and then perfor
<context>
<name>Manager</name>
<message>
<location filename="Manager.cpp" line="353"/>
<location filename="Manager.cpp" line="402"/>
<source>Prompt</source>
<translation>Prompt</translation>
</message>
@ -2498,7 +2516,7 @@ Please go to “Scan to” and change the accessible scan folder and then perfor
<context>
<name>hg_settingdialog</name>
<message>
<location filename="hg_settingdialog.cpp" line="342"/>
<location filename="hg_settingdialog.cpp" line="350"/>
<source>existing configuration scheme</source>
<translation>Existing configuration plan:</translation>
</message>
@ -2523,22 +2541,22 @@ Please go to “Scan to” and change the accessible scan folder and then perfor
<translation type="vanished">Default scheme</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="349"/>
<location filename="hg_settingdialog.cpp" line="357"/>
<source>Add new</source>
<translation>Add new</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="357"/>
<location filename="hg_settingdialog.cpp" line="365"/>
<source>Save</source>
<translation>Save</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="365"/>
<location filename="hg_settingdialog.cpp" line="373"/>
<source>Delete</source>
<translation>Delete</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="374"/>
<location filename="hg_settingdialog.cpp" line="382"/>
<source>Delete all</source>
<translation>Delete all</translation>
</message>
@ -2552,184 +2570,184 @@ Please go to “Scan to” and change the accessible scan folder and then perfor
<translation type="vanished">The current parameter settings are inconsistent with the configuration scheme %1. To use the configuration scheme %1 parameters, please click the restore button</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="384"/>
<location filename="hg_settingdialog.cpp" line="2859"/>
<location filename="hg_settingdialog.cpp" line="392"/>
<location filename="hg_settingdialog.cpp" line="2909"/>
<source>The current parameter settings are inconsistent with the configuration scheme &apos;%1&apos;. To use the configuration scheme &apos;%1&apos; parameters, please click the restore button</source>
<translation>The current parameter settings are inconsistent with the configuration scheme &quot;%1&quot;. To use the configuration scheme &quot;%1&quot; parameters, please click the restore button</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="389"/>
<location filename="hg_settingdialog.cpp" line="397"/>
<source>Restore</source>
<translation>Restore</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="430"/>
<location filename="hg_settingdialog.cpp" line="438"/>
<source>about...</source>
<translation>About...</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="432"/>
<location filename="hg_settingdialog.cpp" line="440"/>
<source>scan</source>
<translation>Scan</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="434"/>
<location filename="hg_settingdialog.cpp" line="2125"/>
<location filename="hg_settingdialog.cpp" line="442"/>
<location filename="hg_settingdialog.cpp" line="2175"/>
<source>ok</source>
<translation>OK</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="437"/>
<location filename="hg_settingdialog.cpp" line="445"/>
<source>cancel</source>
<translation>Cancel</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="463"/>
<location filename="hg_settingdialog.cpp" line="471"/>
<source>configuration scheme management</source>
<translation>Configuration plan management</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="509"/>
<location filename="hg_settingdialog.cpp" line="517"/>
<source>regional crop</source>
<translation>Regional crop</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="529"/>
<location filename="hg_settingdialog.cpp" line="537"/>
<source>custom tone curve</source>
<translation>Custom tone curve</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1157"/>
<location filename="hg_settingdialog.cpp" line="1196"/>
<location filename="hg_settingdialog.cpp" line="1258"/>
<location filename="hg_settingdialog.cpp" line="1283"/>
<location filename="hg_settingdialog.cpp" line="1300"/>
<location filename="hg_settingdialog.cpp" line="1540"/>
<location filename="hg_settingdialog.cpp" line="1621"/>
<location filename="hg_settingdialog.cpp" line="1707"/>
<location filename="hg_settingdialog.cpp" line="1768"/>
<location filename="hg_settingdialog.cpp" line="1191"/>
<location filename="hg_settingdialog.cpp" line="1230"/>
<location filename="hg_settingdialog.cpp" line="1292"/>
<location filename="hg_settingdialog.cpp" line="1317"/>
<location filename="hg_settingdialog.cpp" line="1350"/>
<location filename="hg_settingdialog.cpp" line="1590"/>
<location filename="hg_settingdialog.cpp" line="1671"/>
<location filename="hg_settingdialog.cpp" line="1757"/>
<location filename="hg_settingdialog.cpp" line="1818"/>
<source>Prompt</source>
<translation>Prompt</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1157"/>
<location filename="hg_settingdialog.cpp" line="1258"/>
<location filename="hg_settingdialog.cpp" line="1300"/>
<location filename="hg_settingdialog.cpp" line="1540"/>
<location filename="hg_settingdialog.cpp" line="1621"/>
<location filename="hg_settingdialog.cpp" line="1707"/>
<location filename="hg_settingdialog.cpp" line="1768"/>
<location filename="hg_settingdialog.cpp" line="1191"/>
<location filename="hg_settingdialog.cpp" line="1292"/>
<location filename="hg_settingdialog.cpp" line="1350"/>
<location filename="hg_settingdialog.cpp" line="1590"/>
<location filename="hg_settingdialog.cpp" line="1671"/>
<location filename="hg_settingdialog.cpp" line="1757"/>
<location filename="hg_settingdialog.cpp" line="1818"/>
<source>The funtion is unsupported</source>
<translation>This version does not support this feature.</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1196"/>
<location filename="hg_settingdialog.cpp" line="1283"/>
<location filename="hg_settingdialog.cpp" line="1230"/>
<location filename="hg_settingdialog.cpp" line="1317"/>
<source>This function may cause a decrease in the speed of drawing.</source>
<translation>This function may cause a decrease in the speed of drawing.</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1817"/>
<location filename="hg_settingdialog.cpp" line="1867"/>
<source>about </source>
<translation>About </translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1822"/>
<location filename="hg_settingdialog.cpp" line="1830"/>
<location filename="hg_settingdialog.cpp" line="1838"/>
<location filename="hg_settingdialog.cpp" line="1846"/>
<location filename="hg_settingdialog.cpp" line="1855"/>
<location filename="hg_settingdialog.cpp" line="1868"/>
<location filename="hg_settingdialog.cpp" line="1882"/>
<location filename="hg_settingdialog.cpp" line="1872"/>
<location filename="hg_settingdialog.cpp" line="1880"/>
<location filename="hg_settingdialog.cpp" line="1888"/>
<location filename="hg_settingdialog.cpp" line="1896"/>
<location filename="hg_settingdialog.cpp" line="1905"/>
<location filename="hg_settingdialog.cpp" line="1918"/>
<location filename="hg_settingdialog.cpp" line="1932"/>
<source>Not supported</source>
<translation>Not supported</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1825"/>
<location filename="hg_settingdialog.cpp" line="1875"/>
<source>&lt;p&gt;Device model: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;Model: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1833"/>
<location filename="hg_settingdialog.cpp" line="1883"/>
<source>&lt;p&gt;Driver version: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;Driver Version: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1841"/>
<location filename="hg_settingdialog.cpp" line="1891"/>
<source>&lt;p&gt;Firmware number: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;Firmware Version: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1849"/>
<location filename="hg_settingdialog.cpp" line="1899"/>
<source>&lt;p&gt;Serial number: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;Serial Number: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1857"/>
<location filename="hg_settingdialog.cpp" line="1862"/>
<location filename="hg_settingdialog.cpp" line="1870"/>
<location filename="hg_settingdialog.cpp" line="1907"/>
<location filename="hg_settingdialog.cpp" line="1912"/>
<source>&lt;p&gt;Roller count: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;Roller Count: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1875"/>
<location filename="hg_settingdialog.cpp" line="1920"/>
<location filename="hg_settingdialog.cpp" line="1925"/>
<source>&lt;p&gt;History count: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;Scan Count: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="1885"/>
<location filename="hg_settingdialog.cpp" line="1935"/>
<source>&lt;p&gt;Initial startup time: %1&lt;/p&gt;</source>
<translation>&lt;p&gt;Initial Startup Time: %1&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2076"/>
<location filename="hg_settingdialog.cpp" line="2126"/>
<source>Please select to overwrite the original configuration:</source>
<translation>Please select overwrite original configuration:</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2078"/>
<location filename="hg_settingdialog.cpp" line="2128"/>
<source>,or add a new configuration</source>
<translation>, or add new configuration</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2081"/>
<location filename="hg_settingdialog.cpp" line="2131"/>
<source>save the configuration</source>
<translation>Save configuration</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2086"/>
<location filename="hg_settingdialog.cpp" line="2136"/>
<source>cover original configuration:</source>
<translation>Overwrite original configuration:</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2090"/>
<location filename="hg_settingdialog.cpp" line="2140"/>
<source>add new configuration</source>
<translation>Add new configuration</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2094"/>
<location filename="hg_settingdialog.cpp" line="2144"/>
<source>rename:</source>
<translation>Rename:</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2136"/>
<location filename="hg_settingdialog.cpp" line="2150"/>
<location filename="hg_settingdialog.cpp" line="3011"/>
<location filename="hg_settingdialog.cpp" line="2186"/>
<location filename="hg_settingdialog.cpp" line="2200"/>
<location filename="hg_settingdialog.cpp" line="3061"/>
<source>tips</source>
<translation>Prompt</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2136"/>
<location filename="hg_settingdialog.cpp" line="2186"/>
<source>scheme name cannot be empty</source>
<translation>Configuration name cannot be blank</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2150"/>
<location filename="hg_settingdialog.cpp" line="2200"/>
<source>scheme name: </source>
<translation>Configuration name: </translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="2150"/>
<location filename="hg_settingdialog.cpp" line="2200"/>
<source> already exists</source>
<translation> already exists</translation>
</message>
@ -2750,12 +2768,12 @@ Please go to “Scan to” and change the accessible scan folder and then perfor
<translation type="vanished">&lt;/p&gt;</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3001"/>
<location filename="hg_settingdialog.cpp" line="3051"/>
<source>Add new scheme</source>
<translation>Add new scheme</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3011"/>
<location filename="hg_settingdialog.cpp" line="3061"/>
<source>The configuration scheme already exists</source>
<translation>The configuration scheme already exists</translation>
</message>
@ -2764,18 +2782,18 @@ Please go to “Scan to” and change the accessible scan folder and then perfor
<translation type="vanished">Rename configuration</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3064"/>
<location filename="hg_settingdialog.cpp" line="3086"/>
<location filename="hg_settingdialog.cpp" line="3114"/>
<location filename="hg_settingdialog.cpp" line="3136"/>
<source>be sure to delete the configuration</source>
<translation>Delete configuration</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3065"/>
<location filename="hg_settingdialog.cpp" line="3115"/>
<source>Are you sure you want to delete the configuration &quot;</source>
<translation>Are you sure you want to delete configuration </translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3065"/>
<location filename="hg_settingdialog.cpp" line="3115"/>
<source>&quot; ?</source>
<translation>?</translation>
</message>
@ -2788,7 +2806,7 @@ Please go to “Scan to” and change the accessible scan folder and then perfor
<translation type="vanished">No</translation>
</message>
<message>
<location filename="hg_settingdialog.cpp" line="3087"/>
<location filename="hg_settingdialog.cpp" line="3137"/>
<source>Are you sure you want to delete the configuration?</source>
<translation>Are you sure you want to delete all configurations?</translation>
</message>

View File

@ -0,0 +1,37 @@
#include "dialog_abnormal_img_select.h"
#include "ui_dialog_abnormal_img_select.h"
Dialog_abnormal_img_select::Dialog_abnormal_img_select(HGImage image, QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog_abnormal_img_select)
{
ui->setupUi(this);
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_view = new HGImgView();
m_view->addImage(image);
ui->stackedWidget->addWidget(m_view);
ui->stackedWidget->setCurrentWidget(m_view);
}
Dialog_abnormal_img_select::~Dialog_abnormal_img_select()
{
delete ui;
}
SANE_Abnormal_Image_Treat Dialog_abnormal_img_select::getUserSelect()
{
return m_result;
}
void Dialog_abnormal_img_select::on_pushButton_reserve_clicked()
{
m_result = SANE_Abnormal_Image_Keep;
close();
}
void Dialog_abnormal_img_select::on_pushButton_discard_clicked()
{
m_result = SANE_Abnormal_Image_Discard;
close();
}

View File

@ -0,0 +1,35 @@
#ifndef DIALOG_ABNORMAL_IMG_SELECT_H
#define DIALOG_ABNORMAL_IMG_SELECT_H
#include <QDialog>
#include "sane/sane_ex.h"
#include "HGImgView.h"
namespace Ui {
class Dialog_abnormal_img_select;
}
class Dialog_abnormal_img_select : public QDialog
{
Q_OBJECT
public:
explicit Dialog_abnormal_img_select(HGImage image, QWidget *parent = nullptr);
~Dialog_abnormal_img_select();
SANE_Abnormal_Image_Treat getUserSelect();
private slots:
void on_pushButton_reserve_clicked();
void on_pushButton_discard_clicked();
private:
Ui::Dialog_abnormal_img_select *ui;
SANE_Abnormal_Image_Treat m_result;
HGImgView *m_view;
};
#endif // DIALOG_ABNORMAL_IMG_SELECT_H

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog_abnormal_img_select</class>
<widget class="QDialog" name="Dialog_abnormal_img_select">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>817</width>
<height>551</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="page"/>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_reserve">
<property name="text">
<string>Reserve</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_discard">
<property name="text">
<string>Discard</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -331,3 +331,20 @@ void pump_ui_message(void* reserved)
{
QApplication::processEvents();
}
int abnormal_image(SANE_Image *img, HGWindow parent)
{
if (!qApp)
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
if (NULL == g_manager)
{
g_manager = new Manager;
}
return g_manager->showAbnormalImgUi(nullptr == g_hThread, img);
}

View File

@ -128,3 +128,10 @@ enum which_ui
HGEXPORT int close_ui(int which);
HGEXPORT void pump_ui_message(void* reserved);
//功能:异常图片交互
//
//参数:获取异常的图像
//
//返回SANE_Abnormal_Image_Treat
HGEXPORT int abnormal_image(SANE_Image *img);