为兼容APP不通过属性设置传输模式,直接以任意方式获取图片导致准备的图片格式不符导致的问题,作以下更改:缓冲图片全部为完整的位图文件格式,在不同的传输方式协议中,跳过对应的文件头再获取真实需要的数据。

This commit is contained in:
gb 2023-07-03 12:23:44 +08:00
parent 2cc8378a61
commit 14f784dfbe
4 changed files with 19 additions and 7 deletions

View File

@ -132,7 +132,7 @@ struct __declspec(novtable) IRef
COM_API_DECLARE(long, add_ref(void)); COM_API_DECLARE(long, add_ref(void));
COM_API_DECLARE(long, release(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, width(void));
COM_API_DECLARE(int, line_bytes(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, 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)); COM_API_DECLARE(int, image_status(void));
COM_API_DECLARE(size_t, get_bits_offset(void));
}; };
struct __declspec(novtable) ISaneInvoker : public IRef struct __declspec(novtable) ISaneInvoker : public IRef
{ {

View File

@ -505,7 +505,7 @@ std::string scanned_img::file_header(SANE_ImageType type, float resolution, twai
{ {
std::string h(""); 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 }; BITMAPINFOHEADER bih = { 0 };
int pal_size = 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) else if (bih.biBitCount == 8)
pal_size = 256 * sizeof(int); pal_size = 256 * sizeof(int);
if (xfer == TWAIN_XFER_File) /*if (xfer == TWAIN_XFER_File)*/
{ {
BITMAPFILEHEADER fh = { 0 }; BITMAPFILEHEADER fh = { 0 };
fh.bfType = MAKEWORD('B', 'M'); 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)); h += std::string((char*)&bih, sizeof(bih));
pal_size_ = pal_size;
if (bih.biBitCount == 1) if (bih.biBitCount == 1)
{ {
int pal[] = { 0, 0x0ffffff }; int pal[] = { 0, 0x0ffffff };
@ -740,6 +741,13 @@ COM_API_IMPLEMENT(scanned_img, int, image_status(void))
{ {
return status_; 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;
}

View File

@ -61,6 +61,7 @@ class scanned_img : public IScanImg, virtual public refer
std::wstring file_; std::wstring file_;
unsigned int header_size_; unsigned int header_size_;
SANE_FinalImgFormat fmt_; SANE_FinalImgFormat fmt_;
size_t pal_size_;
SANE_Image_Statu status_; SANE_Image_Statu status_;
@ -101,6 +102,7 @@ public:
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)); COM_API_OVERRIDE(int, image_status(void));
COM_API_OVERRIDE(size_t, get_bits_offset(void));
}; };
template<class T> template<class T>

View File

@ -1141,6 +1141,7 @@ Result huagao_ds::userInterfaceEnable(const Identity&, UserInterface& ui)
notfify_close_ = false; notfify_close_ = false;
bUiOnly_ = false; bUiOnly_ = false;
show_setting_ = false; show_setting_ = false;
scanner_->twain_set_transfer((twain_xfer)m_capXferMech);
if (!ui.showUi()) if (!ui.showUi())
{ {
scanner_->ui_show_progress((HWND)ui.parent().raw(), m_bIndicator); scanner_->ui_show_progress((HWND)ui.parent().raw(), m_bIndicator);
@ -1148,7 +1149,6 @@ Result huagao_ds::userInterfaceEnable(const Identity&, UserInterface& ui)
// return seqError(); // return seqError();
xfer_ready_failed_ = false; xfer_ready_failed_ = false;
scanner_->twain_set_transfer((twain_xfer)m_capXferMech);
scanner_status_ = SCANNER_STATUS_SCAN_1; scanner_status_ = SCANNER_STATUS_SCAN_1;
app_trigger_event_ = false; app_trigger_event_ = false;
int err = scanner_->start(); 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); 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(); unsigned char *dst = (unsigned char*)data.memory().data().data();
UInt32 buf_l = data.memory().size(); UInt32 buf_l = data.memory().size();
unsigned int line_l = img->line_bytes(), unsigned int line_l = img->line_bytes(),
@ -1431,8 +1431,8 @@ Result huagao_ds::imageNativeXferGet(const Identity& id, ImageNativeXfer& data)
data.release(); data.release();
data = ImageNativeXfer(img->bytes()); data = ImageNativeXfer(img->bytes());
unsigned long long off = 0; unsigned long long off = sizeof(BITMAPFILEHEADER);
unsigned int total = img->bytes(); unsigned int total = img->bytes() - off;
unsigned char* src = img->data(off, &total), unsigned char* src = img->data(off, &total),
* dst = data.data<unsigned char>().data(); * dst = data.data<unsigned char>().data();
while (off < img->bytes() && src) while (off < img->bytes() && src)
@ -1713,6 +1713,7 @@ Result huagao_ds::customDataSet(const Twpp::Identity& origin, Twpp::CustomData&
char* buf = data.lock<char>(); char* buf = data.lock<char>();
scanner_->twain_set_config(buf, data.size()); scanner_->twain_set_config(buf, data.size());
load_sane_util::to_log(1, L"huagao_ds::customDataSet = %d\r\n", strlen(buf));
return success(); return success();
} }