TWAIN接口补充图片状态信息

This commit is contained in:
gb 2022-09-20 18:14:27 +08:00
parent 4e6f71bd53
commit 779d2552db
5 changed files with 66 additions and 6 deletions

View File

@ -143,6 +143,7 @@ struct __declspec(novtable) IScanImg : public IRef
COM_API_DECLARE(const char*, file(void)); COM_API_DECLARE(const char*, file(void));
COM_API_DECLARE(void, keep_file(bool keep)); COM_API_DECLARE(void, keep_file(bool keep));
COM_API_DECLARE(void, copy_header(SANE_Parameters* head)); COM_API_DECLARE(void, copy_header(SANE_Parameters* head));
COM_API_DECLARE(int, image_status(void));
}; };
struct __declspec(novtable) ISaneInvoker : public IRef struct __declspec(novtable) ISaneInvoker : public IRef
{ {

View File

@ -368,7 +368,7 @@ unsigned int mapping_buf::mapped_bytes(void)
scanned_img::scanned_img(SANE_Handle dev, SANE_Parameters head, int dpi scanned_img::scanned_img(SANE_Handle dev, SANE_Parameters head, int dpi
, const wchar_t* tmp_file, twain_xfer xfer , const wchar_t* tmp_file, twain_xfer xfer
, SANE_FinalImgFormat *fmt) : head_(head), dpi_(dpi), header_size_(0), file_(tmp_file ? tmp_file : L"") , SANE_FinalImgFormat *fmt) : head_(head), dpi_(dpi), header_size_(0), file_(tmp_file ? tmp_file : L"")
, dev_(dev) , dev_(dev), status_(SANE_Image_Statu_OK)
{ {
if (fmt) if (fmt)
fmt_ = *fmt; fmt_ = *fmt;
@ -434,7 +434,7 @@ scanned_img::scanned_img(SANE_Handle dev, SANE_Parameters head, int dpi
} }
scanned_img::scanned_img(SANE_Handle dev, SANE_Parameters head, void* data, unsigned int len, int dpi, const wchar_t* tmp_file scanned_img::scanned_img(SANE_Handle dev, SANE_Parameters head, void* data, unsigned int len, int dpi, const wchar_t* tmp_file
, twain_xfer xfer, SANE_FinalImgFormat* fmt) : head_(head), dpi_(dpi), header_size_(0) , twain_xfer xfer, SANE_FinalImgFormat* fmt) : head_(head), dpi_(dpi), header_size_(0)
, file_(tmp_file ? tmp_file : L""), dev_(dev) , file_(tmp_file ? tmp_file : L""), dev_(dev), status_(SANE_Image_Statu_OK)
{ {
if (fmt) if (fmt)
fmt_ = *fmt; fmt_ = *fmt;
@ -480,6 +480,11 @@ scanned_img::~scanned_img()
delete data_; delete data_;
} }
void scanned_img::set_image_status(SANE_Image_Statu status)
{
status_ = status;
}
std::string scanned_img::file_header(SANE_ImageType type, float resolution, twain_xfer xfer) std::string scanned_img::file_header(SANE_ImageType type, float resolution, twain_xfer xfer)
{ {
std::string h(""); std::string h("");
@ -711,6 +716,10 @@ COM_API_IMPLEMENT(scanned_img, void, copy_header(SANE_Parameters* head))
{ {
*head = head_; *head = head_;
} }
COM_API_IMPLEMENT(scanned_img, int, image_status(void))
{
return status_;
}

View File

@ -62,6 +62,8 @@ class scanned_img : public IScanImg, virtual public refer
unsigned int header_size_; unsigned int header_size_;
SANE_FinalImgFormat fmt_; SANE_FinalImgFormat fmt_;
SANE_Image_Statu status_;
std::string file_header(SANE_ImageType type, float resolution, twain_xfer xfer); std::string file_header(SANE_ImageType type, float resolution, twain_xfer xfer);
void do_result(bool ok, twain_xfer xfer); void do_result(bool ok, twain_xfer xfer);
void swap_rgb(void); void swap_rgb(void);
@ -72,6 +74,7 @@ public:
scanned_img(SANE_Handle dev, SANE_Parameters head, void* data, unsigned int len, int dpi, const wchar_t* tmp_file scanned_img(SANE_Handle dev, SANE_Parameters head, void* data, unsigned int len, int dpi, const wchar_t* tmp_file
, twain_xfer xfer = TWAIN_XFER_Native, SANE_FinalImgFormat *fmt = NULL); , twain_xfer xfer = TWAIN_XFER_Native, SANE_FinalImgFormat *fmt = NULL);
void set_image_status(SANE_Image_Statu status);
protected: protected:
~scanned_img(); ~scanned_img();
@ -96,6 +99,7 @@ public:
COM_API_OVERRIDE(const char*, file(void)); COM_API_OVERRIDE(const char*, file(void));
COM_API_OVERRIDE(void, keep_file(bool keep)); COM_API_OVERRIDE(void, keep_file(bool keep));
COM_API_OVERRIDE(void, copy_header(SANE_Parameters* head)); COM_API_OVERRIDE(void, copy_header(SANE_Parameters* head));
COM_API_OVERRIDE(int, image_status(void));
}; };
template<class T> template<class T>

View File

@ -2193,6 +2193,7 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len)
img = new scanned_img(handle_, simg->header, simg->data, simg->bytes, dpi_, (tmp_path_ + name).c_str(), xfer_, &img_fmt_); img = new scanned_img(handle_, simg->header, simg->data, simg->bytes, dpi_, (tmp_path_ + name).c_str(), xfer_, &img_fmt_);
if (img->bytes() /*>= simg->bytes*/) if (img->bytes() /*>= simg->bytes*/)
{ {
img->set_image_status((SANE_Image_Statu)simg->flag.statu);
images_.save(img); images_.save(img);
} }
else else

View File

@ -723,14 +723,24 @@ Result huagao_ds::capabilitySet(const Identity& origin, Capability& data)
} }
Result huagao_ds::eventProcess(const Identity&, Event& event) Result huagao_ds::eventProcess(const Identity&, Event& event)
{ {
static int count_0 = 0;
const MSG* msg = (const MSG*)event.event(); const MSG* msg = (const MSG*)event.event();
// event.setMessage(Msg::Null); // event.setMessage(Msg::Null);
if (scanner_.get()) if (scanner_.get())
{ {
int ev = scanner_->get_event(); int ev = scanner_->get_event();
if (ev == 0)
count_0++;
else
{
wchar_t msg[128] = { 0 }; wchar_t msg[128] = { 0 };
if(count_0)
swprintf_s(msg, _countof(msg) - 1, L"ds::eventProcess(0x0 +%d)\r\nds::eventProcess(0x%x)\r\n", count_0, ev);
else
swprintf_s(msg, _countof(msg) - 1, L"ds::eventProcess(0x%x)\r\n", ev); swprintf_s(msg, _countof(msg) - 1, L"ds::eventProcess(0x%x)\r\n", ev);
load_sane_util::log_info(msg, 0); load_sane_util::log_info(msg, 0);
count_0 = 0;
}
switch (ev) switch (ev)
{ {
@ -1138,7 +1148,8 @@ Twpp::Result huagao_ds::imageFileXferGet(const Twpp::Identity& origin)
if (img) if (img)
{ {
std::string file(img->file()); std::string file(img->file());
int cv_e = 0; int cv_e = 0,
status = img->image_status();
if (file.empty()) if (file.empty())
{ {
dst = fopen(m_fileXfer.filePath().string().c_str(), "wb"); dst = fopen(m_fileXfer.filePath().string().c_str(), "wb");
@ -1222,6 +1233,21 @@ Twpp::Result huagao_ds::imageFileXferGet(const Twpp::Identity& origin)
} }
} }
//if (ret.status() == ConditionCode::Success)
//{
// switch (status)
// {
// case SANE_Image_Statu_Blank:
// break;
// case SANE_Image_Statu_Double:
// ret.setStatus(ConditionCode::PaperDoubleFeed);
// break;
// case SANE_Image_Statu_Jammed:
// ret.setStatus(ConditionCode::PaperJam);
// break;
// }
//}
{ {
std::wstring info(load_sane_util::ansi2unic(m_fileXfer.filePath().string().c_str())); std::wstring info(load_sane_util::ansi2unic(m_fileXfer.filePath().string().c_str()));
wchar_t r[80] = { 0 }; wchar_t r[80] = { 0 };
@ -1378,6 +1404,7 @@ void huagao_ds::init_support_caps(void)
if (Msg::Set == msg) { if (Msg::Set == msg) {
auto show = data.currentItem<CapType::Indicators>(); auto show = data.currentItem<CapType::Indicators>();
m_bIndicator = show; m_bIndicator = show;
load_sane_util::log_info(m_bIndicator ? L"Set show indicator: true\r\n" : L"Set show indicator: false\r\n", 0);
return success(); return success();
} }
return CapSupGetAllReset<bool, Bool, CapType::Indicators>(msg, data, { FALSE,TRUE }, m_bIndicator, TRUE, m_bIndicator ? 1 : 0, 1); return CapSupGetAllReset<bool, Bool, CapType::Indicators>(msg, data, { FALSE,TRUE }, m_bIndicator, TRUE, m_bIndicator ? 1 : 0, 1);
@ -1411,6 +1438,11 @@ void huagao_ds::init_support_caps(void)
if (Compression::None == mech || mech == Compression::Group4) { if (Compression::None == mech || mech == Compression::Group4) {
m_compression = mech; m_compression = mech;
scanner_->twain_set_compression((SANE_CompressionType)m_compression); scanner_->twain_set_compression((SANE_CompressionType)m_compression);
{
wchar_t info[128] = { 0 };
swprintf_s(info, _countof(info) - 1, L"set CapType::ICompression = %s\r\n", Compression::None == mech ? L"None" : L"Group4");
load_sane_util::log_info(info, 0);
}
return success(); return success();
} }
else else
@ -1625,6 +1657,11 @@ void huagao_ds::init_support_caps(void)
if (mech == XferMech::Native || mech == XferMech::Memory || mech == XferMech::File) { if (mech == XferMech::Native || mech == XferMech::Memory || mech == XferMech::File) {
m_capXferMech = mech; m_capXferMech = mech;
scanner_->twain_set_transfer((twain_xfer)m_capXferMech); scanner_->twain_set_transfer((twain_xfer)m_capXferMech);
{
wchar_t info[128] = { 0 }, * des[] = {L"Native", L"File", L"Memory"};
swprintf_s(info, _countof(info) - 1, L"set CapType::IXferMech = %s\r\n", des[(int)m_capXferMech]);
load_sane_util::log_info(info, 0);
}
return success(); return success();
} }
else { else {
@ -1834,6 +1871,14 @@ void huagao_ds::init_support_caps(void)
fmt != Twpp::ImageFileFormat::Tiff) fmt != Twpp::ImageFileFormat::Tiff)
return badValue(); return badValue();
m_fileXfer.setFormat((Twpp::ImageFileFormat)data.currentItem<ImageFileFormat>()); m_fileXfer.setFormat((Twpp::ImageFileFormat)data.currentItem<ImageFileFormat>());
{
if (fmt == Twpp::ImageFileFormat::Bmp)
load_sane_util::log_info(L"set CapType::IImageFileFormat = Bmp\r\n", 0);
else if (fmt == Twpp::ImageFileFormat::Jfif)
load_sane_util::log_info(L"set CapType::IImageFileFormat = Jfif\r\n", 0);
else if (fmt == Twpp::ImageFileFormat::Tiff)
load_sane_util::log_info(L"set CapType::IImageFileFormat = Tiff\r\n", 0);
}
return success(); return success();
//if(Msg::Set == msg) //if(Msg::Set == msg)
// init.img_format = (SANE_ImageType)(int)data.currentItem<ImageFileFormat>(); // init.img_format = (SANE_ImageType)(int)data.currentItem<ImageFileFormat>();