为兼容APP不通过属性设置传输模式,直接以任意方式获取图片导致准备的图片格式不符导致的问题,作以下更改:缓冲图片全部为完整的位图文件格式,在不同的传输方式协议中,跳过对应的文件头再获取真实需要的数据。
This commit is contained in:
parent
2cc8378a61
commit
14f784dfbe
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue