From 14f784dfbe9ccf3cee1742b56714da2fd4f07547 Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Mon, 3 Jul 2023 12:23:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E5=85=BC=E5=AE=B9APP=E4=B8=8D?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E5=B1=9E=E6=80=A7=E8=AE=BE=E7=BD=AE=E4=BC=A0?= =?UTF-8?q?=E8=BE=93=E6=A8=A1=E5=BC=8F=EF=BC=8C=E7=9B=B4=E6=8E=A5=E4=BB=A5?= =?UTF-8?q?=E4=BB=BB=E6=84=8F=E6=96=B9=E5=BC=8F=E8=8E=B7=E5=8F=96=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=AF=BC=E8=87=B4=E5=87=86=E5=A4=87=E7=9A=84=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=A0=BC=E5=BC=8F=E4=B8=8D=E7=AC=A6=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BD=9C=E4=BB=A5=E4=B8=8B?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E7=BC=93=E5=86=B2=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E4=B8=BA=E5=AE=8C=E6=95=B4=E7=9A=84=E4=BD=8D?= =?UTF-8?q?=E5=9B=BE=E6=96=87=E4=BB=B6=E6=A0=BC=E5=BC=8F=EF=BC=8C=E5=9C=A8?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E7=9A=84=E4=BC=A0=E8=BE=93=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E4=B8=AD=EF=BC=8C=E8=B7=B3=E8=BF=87=E5=AF=B9?= =?UTF-8?q?=E5=BA=94=E7=9A=84=E6=96=87=E4=BB=B6=E5=A4=B4=E5=86=8D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=9C=9F=E5=AE=9E=E9=9C=80=E8=A6=81=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sane/s2t_api.h | 3 ++- sane/scanned_img.cpp | 12 ++++++++++-- sane/scanned_img.h | 2 ++ twain/twain/huagaods.cpp | 9 +++++---- 4 files changed, 19 insertions(+), 7 deletions(-) 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(); }