diff --git a/sane/s2t_api.h b/sane/s2t_api.h index fac22e1..921ef6d 100644 --- a/sane/s2t_api.h +++ b/sane/s2t_api.h @@ -132,7 +132,7 @@ struct __declspec(novtable) IRef COM_API_DECLARE(long, add_ref(void)); COM_API_DECLARE(long, release(void)); }; -struct __declspec(novtable) IScanImg : public IRef +struct __declspec(novtable) IScanImg : public IRef // 为兼容TWAIN传输方式,位图全部转换为完整的位图文件内容,TWAIN协议层在获取数据时,根据不同传输方式跳过对应的文件头即可 - 2023-07-03 { COM_API_DECLARE(int, width(void)); COM_API_DECLARE(int, line_bytes(void)); @@ -149,6 +149,7 @@ struct __declspec(novtable) IScanImg : public IRef COM_API_DECLARE(void, keep_file(bool keep)); COM_API_DECLARE(void, copy_header(SANE_Parameters* head)); COM_API_DECLARE(int, image_status(void)); + COM_API_DECLARE(size_t, get_bits_offset(void)); }; struct __declspec(novtable) ISaneInvoker : public IRef { diff --git a/sane/scanned_img.cpp b/sane/scanned_img.cpp index b8a4a83..24a4cdc 100644 --- a/sane/scanned_img.cpp +++ b/sane/scanned_img.cpp @@ -505,7 +505,7 @@ std::string scanned_img::file_header(SANE_ImageType type, float resolution, twai { std::string h(""); - if (type == SANE_IMAGE_TYPE_BMP && xfer != TWAIN_XFER_Memory) + if (type == SANE_IMAGE_TYPE_BMP /*&& xfer != TWAIN_XFER_Memory*/) { BITMAPINFOHEADER bih = { 0 }; int pal_size = 0; @@ -524,7 +524,7 @@ std::string scanned_img::file_header(SANE_ImageType type, float resolution, twai else if (bih.biBitCount == 8) pal_size = 256 * sizeof(int); - if (xfer == TWAIN_XFER_File) + /*if (xfer == TWAIN_XFER_File)*/ { BITMAPFILEHEADER fh = { 0 }; fh.bfType = MAKEWORD('B', 'M'); @@ -535,6 +535,7 @@ std::string scanned_img::file_header(SANE_ImageType type, float resolution, twai } h += std::string((char*)&bih, sizeof(bih)); + pal_size_ = pal_size; if (bih.biBitCount == 1) { int pal[] = { 0, 0x0ffffff }; @@ -740,6 +741,13 @@ COM_API_IMPLEMENT(scanned_img, int, image_status(void)) { return status_; } +COM_API_IMPLEMENT(scanned_img, size_t, get_bits_offset(void)) +{ + if (fmt_.img_format == SANE_IMAGE_TYPE_BMP) + return sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + pal_size_; + else + return 0; +} diff --git a/sane/scanned_img.h b/sane/scanned_img.h index 4beb9bd..c8d8ca0 100644 --- a/sane/scanned_img.h +++ b/sane/scanned_img.h @@ -61,6 +61,7 @@ class scanned_img : public IScanImg, virtual public refer std::wstring file_; unsigned int header_size_; SANE_FinalImgFormat fmt_; + size_t pal_size_; SANE_Image_Statu status_; @@ -101,6 +102,7 @@ public: COM_API_OVERRIDE(void, keep_file(bool keep)); COM_API_OVERRIDE(void, copy_header(SANE_Parameters* head)); COM_API_OVERRIDE(int, image_status(void)); + COM_API_OVERRIDE(size_t, get_bits_offset(void)); }; template diff --git a/twain/twain/huagaods.cpp b/twain/twain/huagaods.cpp index 4c04764..3506316 100644 --- a/twain/twain/huagaods.cpp +++ b/twain/twain/huagaods.cpp @@ -1141,6 +1141,7 @@ Result huagao_ds::userInterfaceEnable(const Identity&, UserInterface& ui) notfify_close_ = false; bUiOnly_ = false; show_setting_ = false; + scanner_->twain_set_transfer((twain_xfer)m_capXferMech); if (!ui.showUi()) { scanner_->ui_show_progress((HWND)ui.parent().raw(), m_bIndicator); @@ -1148,7 +1149,6 @@ Result huagao_ds::userInterfaceEnable(const Identity&, UserInterface& ui) // return seqError(); xfer_ready_failed_ = false; - scanner_->twain_set_transfer((twain_xfer)m_capXferMech); scanner_status_ = SCANNER_STATUS_SCAN_1; app_trigger_event_ = false; int err = scanner_->start(); @@ -1343,7 +1343,7 @@ Result huagao_ds::imageMemXferGet(const Identity& origin, ImageMemXfer& data) } IScanImg *img = pending_xfer_.img ? pending_xfer_.img : scanner_->take_first_image(TWAIN_XFER_Memory); - unsigned long long off = pending_xfer_.img ? pending_xfer_.off : 0; + unsigned long long off = pending_xfer_.img ? pending_xfer_.off : img->get_bits_offset(); unsigned char *dst = (unsigned char*)data.memory().data().data(); UInt32 buf_l = data.memory().size(); unsigned int line_l = img->line_bytes(), @@ -1431,8 +1431,8 @@ Result huagao_ds::imageNativeXferGet(const Identity& id, ImageNativeXfer& data) data.release(); data = ImageNativeXfer(img->bytes()); - unsigned long long off = 0; - unsigned int total = img->bytes(); + unsigned long long off = sizeof(BITMAPFILEHEADER); + unsigned int total = img->bytes() - off; unsigned char* src = img->data(off, &total), * dst = data.data().data(); while (off < img->bytes() && src) @@ -1713,6 +1713,7 @@ Result huagao_ds::customDataSet(const Twpp::Identity& origin, Twpp::CustomData& char* buf = data.lock(); scanner_->twain_set_config(buf, data.size()); + load_sane_util::to_log(1, L"huagao_ds::customDataSet = %d\r\n", strlen(buf)); return success(); }