调整高dpi大幅面纸张连续扫描导致内存过高

This commit is contained in:
yangjiaxuan 2023-04-12 18:36:38 +08:00
parent 8f242dc071
commit a9a6222ddc
2 changed files with 317 additions and 1 deletions

View File

@ -342,6 +342,10 @@ MainWindow::MainWindow(const QString& appLang, QWidget *parent)
connect(this, SIGNAL(scan_working(QString)), this, SLOT(on_scan_working(QString)), Qt::QueuedConnection); connect(this, SIGNAL(scan_working(QString)), this, SLOT(on_scan_working(QString)), Qt::QueuedConnection);
connect(this, SIGNAL(scan_finish(QString, int)), this, SLOT(on_scan_finish(QString, int)), Qt::QueuedConnection); connect(this, SIGNAL(scan_finish(QString, int)), this, SLOT(on_scan_finish(QString, int)), Qt::QueuedConnection);
connect(this, SIGNAL(fwUpgradeAndDevLock_Finish()), this, SLOT(on_fwUpgradeAndDevLock_Finish()), Qt::QueuedConnection); connect(this, SIGNAL(fwUpgradeAndDevLock_Finish()), this, SLOT(on_fwUpgradeAndDevLock_Finish()), Qt::QueuedConnection);
connect(this, SIGNAL(addNewImage(QString)), this, SLOT(on_addNewImage(QString)), Qt::QueuedConnection);
connect(this, SIGNAL(wrong_image(QString,int)), this, SLOT(on_wrong_image(QString,int)), Qt::QueuedConnection);
connect(this, SIGNAL(determineMemory()), this, SLOT(on_determineMemory()), Qt::QueuedConnection);
connect(this, SIGNAL(promptScanStatusInfo(QString,bool)), this, SLOT(on_promptScanStatusInfo(QString,bool)), Qt::QueuedConnection);
connect(this, SIGNAL(sane_dev_error(QString)), this, SLOT(on_sane_dev_error(QString)), Qt::QueuedConnection); connect(this, SIGNAL(sane_dev_error(QString)), this, SLOT(on_sane_dev_error(QString)), Qt::QueuedConnection);
connect(m_dialogLog, SIGNAL(continueScan()), this, SLOT(on_continueScan())); connect(m_dialogLog, SIGNAL(continueScan()), this, SLOT(on_continueScan()));
connect(m_dialogLog, SIGNAL(stopScan()), this, SLOT(on_stopScan())); connect(m_dialogLog, SIGNAL(stopScan()), this, SLOT(on_stopScan()));
@ -1456,6 +1460,64 @@ void MainWindow::on_fwUpgradeAndDevLock_Finish()
upgradeFwAndLockDevice(); upgradeFwAndLockDevice();
} }
void MainWindow::on_addNewImage(const QString &filename)
{
if (-1 == m_scanInsertPos)
{
m_thumb->addItem(filename);
}
else
{
m_thumb->insertItem(filename, m_scanInsertPos);
++m_scanInsertPos;
}
}
void MainWindow::on_wrong_image(const QString &fileName, int status)
{
int count = 0;
if(m_scanInsertPos == -1)
m_thumb->getItemCount(&count);
else
count = m_scanInsertPos;
dialog_wrong_img *dlg = new dialog_wrong_img(this, fileName, count, status);
connect(dlg, SIGNAL(handle_wrong_img(dialog_wrong_img*, bool)), this, SLOT(on_wrong_image_decide(dialog_wrong_img*, bool)));
wrong_imgs_.push_back(dlg);
dlg->show();
}
void MainWindow::on_determineMemory()
{
if (!m_cacheDirNotify)
{
m_cacheDirNotify = true;
QString info = tr("the disk space in the current path is unsufficient, please select a new path or clear the disk space in time.");
m_wndStatusBar->setDeviceStatusInfo(info, true);
m_dialogLog->addLog(info, true);
HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "disk space is unsufficient!");
QMessageBox::warning(this, tr("warning"), info);
}
if (!m_AquirePathNotify)
{
m_AquirePathNotify = true;
QString info = tr("the disk space in the current path is unsufficient, please select a new path or clear the disk space in time.");
m_wndStatusBar->setDeviceStatusInfo(info, true);
m_dialogLog->addLog(info, true);
HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "disk space is unsufficient!");
QMessageBox::warning(this, tr("warning"), info);
}
on_stopScan();
}
void MainWindow::on_promptScanStatusInfo(QString info, bool error)
{
m_dialogLog->addLog(info, error);
m_wndStatusBar->setDeviceStatusInfo(info, error);
}
void MainWindow::on_export_scanned_image(void) void MainWindow::on_export_scanned_image(void)
{ {
m_dialogLog->hide(); m_dialogLog->hide();
@ -2884,11 +2946,257 @@ int MainWindow::sane_ex_callback(SANE_Handle hdev, int code, void *data, unsigne
HGImageInfo imgInfo = {(HGUInt)sane_img->header.pixels_per_line, (HGUInt)sane_img->header.lines, HGImageInfo imgInfo = {(HGUInt)sane_img->header.pixels_per_line, (HGUInt)sane_img->header.lines,
imgType, (HGUInt)sane_img->header.bytes_per_line, HGBASE_IMGORIGIN_TOP}; imgType, (HGUInt)sane_img->header.bytes_per_line, HGBASE_IMGORIGIN_TOP};
int statu = sane_img->flag.statu;
HGImage img = nullptr; HGImage img = nullptr;
HGBase_CreateImageFromData(imgData, &imgInfo, nullptr, imgType, HGBASE_IMGORIGIN_TOP, &img); HGBase_CreateImageFromData(imgData, &imgInfo, nullptr, imgType, HGBASE_IMGORIGIN_TOP, &img);
if (nullptr != img) if (nullptr != img)
{ {
emit p->new_image(img, sane_img->flag.statu); HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi);
if (1 == p->m_scanType)
{
if (!p->judgeDiskSpace(Dialog_ClrCache::getCachePath(), false))
{
emit p->determineMemory();
HGBase_DestroyImage(img);
break;
}
QString fileName = p->getCacheFileName(img);
HGImgFmtSaveInfo info;
info.jpegQuality = 100;
info.tiffCompression = HGIMGFMT_TIFFCOMP_LZW;
info.tiffJpegQuality = 0;
HGResult ret = HGImgFmt_SaveImage(img, 0, &info, getStdString(fileName).c_str());
if(ret == HGBASE_ERR_OK)
{
if (statu != SANE_Image_Statu_OK)
{
emit p->wrong_image(fileName, statu);
}
else
{
emit p->addNewImage(fileName);
}
}
else
{
emit p->promptScanStatusInfo(tr("save image failed: ") + getLogInfo(ret), true);
}
}
else if (2 == p->m_scanType)
{
if (!p->judgeDiskSpace(p->m_aquireIntoSaveParam.m_savePath, false))
{
emit p->determineMemory();
HGBase_DestroyImage(img);
break;
}
++p->m_aquireIntoPageIndex;
if ((1 == p->m_aquireIntoSaveParam.m_fileNameOddEventType && 1 != p->m_aquireIntoPageIndex % 2)
|| (2 == p->m_aquireIntoSaveParam.m_fileNameOddEventType && 0 != p->m_aquireIntoPageIndex % 2))
{
HGBase_DestroyImage(img);
break;
}
if (p->m_aquireIntoSaveParam.m_isSaveAsMultiPage)
{
if (1 == p->m_aquireIntoSaveParam.m_multiPagesType && p->m_aquireIntoMultiPageCount == p->m_aquireIntoSaveParam.m_customMultiPages)
{
if (nullptr != p->m_scanImgFmtWriter)
{
HGImgFmt_CloseImageWriter(p->m_scanImgFmtWriter);
p->m_scanImgFmtWriter = nullptr;
emit p->addNewImage(p->m_scanFileName);
p->m_scanFileName.clear();
++p->m_aquireIntoSaveParam.m_fileNameStartIndex;
p->m_aquireIntoMultiPageCount = 0;
}
}
if (nullptr == p->m_scanImgFmtWriter)
{
assert(p->m_scanFileName.isEmpty());
HGResult ret = HGBase_CreateDir(getStdString(p->m_aquireIntoSaveParam.m_savePath).c_str());
if (ret != HGBASE_ERR_OK)
{
emit p->promptScanStatusInfo(tr("create savepath failed: ") + getLogInfo(ret), true);
}
QString scanFileName;
while (1)
{
scanFileName = p->m_aquireIntoSaveParam.m_savePath + p->m_aquireIntoSaveParam.m_fileNamePrefix + QString("%1.%2")
.arg(p->m_aquireIntoSaveParam.m_fileNameStartIndex, p->m_aquireIntoSaveParam.m_fileNameDigits, 10, QLatin1Char('0'))
.arg(p->m_aquireIntoSaveParam.m_fileNameExt);
QFileInfo fileInfo(scanFileName);
if (fileInfo.isFile())
{
++p->m_aquireIntoSaveParam.m_fileNameStartIndex;
}
else
{
break;
}
}
ret = HGImgFmt_OpenImageWriter(getStdString(getStdFileName(scanFileName)).c_str(), 0, &p->m_scanImgFmtWriter);
if(ret != HGBASE_ERR_OK)
{
emit p->promptScanStatusInfo(tr("create image doc failed: ") + getLogInfo(ret), true);
}
if (nullptr != p->m_scanImgFmtWriter)
p->m_scanFileName = scanFileName;
}
if (nullptr != p->m_scanImgFmtWriter)
{
HGImgFmtSaveInfo saveInfo;
saveInfo.jpegQuality = (HGUInt)p->m_aquireIntoSaveParam.m_jpegQuality;
saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_NONE;
saveInfo.tiffJpegQuality = (HGUInt)p->m_aquireIntoSaveParam.m_tiffQuality;
HGImageInfo imgInfo;
HGBase_GetImageInfo(img, &imgInfo);
if (HGBASE_IMGTYPE_BINARY == imgInfo.type)
{
if (1 == p->m_aquireIntoSaveParam.m_tiffCompressionBW)
saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_LZW;
else if (2 == p->m_aquireIntoSaveParam.m_tiffCompressionBW)
saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_CCITTFAX4;
}
else
{
if (1 == p->m_aquireIntoSaveParam.m_tiffCompression)
saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_LZW;
else if (2 == p->m_aquireIntoSaveParam.m_tiffCompression)
saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_JPEG;
}
HGResult ret = HGImgFmt_SaveImageToWriter(p->m_scanImgFmtWriter, img, &saveInfo);
if(ret != HGBASE_ERR_OK)
{
emit p->promptScanStatusInfo(tr("save image doc failed: ") + getLogInfo(ret), true);
}
++p->m_aquireIntoMultiPageCount;
}
}
else
{
assert(p->m_scanFileName.isEmpty());
assert(nullptr == p->m_scanImgFmtWriter);
QString savePath = p->m_aquireIntoSaveParam.m_savePath;
if (p->m_aquireIntoSaveParam.m_isUseSubfolderByBlankPages)
{
HGBool isBlank = HGFALSE;
HGImgProc_ImageBlankCheck(img, nullptr, &isBlank);
if (isBlank)
{
p->m_aquireIntoInBlank = true;
HGBase_DestroyImage(img);
break;
}
else
{
if (p->m_aquireIntoInBlank)
{
++p->m_aquireIntoBatchStartIndex;
}
p->m_aquireIntoInBlank = false;
}
char batchDir[20];
sprintf(batchDir, "batch%d", p->m_aquireIntoBatchStartIndex);
savePath = getStdFileName(savePath + batchDir + "/");
}
if (p->m_aquireIntoSaveParam.m_isUseSubfolderByColor)
{
QString colorModeName;
HGImageInfo imgInfo;
HGBase_GetImageInfo(img, &imgInfo);
if (HGBASE_IMGTYPE_BINARY == imgInfo.type)
colorModeName = tr("binary");
else if (HGBASE_IMGTYPE_GRAY == imgInfo.type)
colorModeName = tr("gray");
else
colorModeName = tr("rgb");
savePath = getStdFileName(savePath + colorModeName + "/");
}
HGResult ret = HGBase_CreateDir(getStdString(savePath).c_str());
if(ret != HGBASE_ERR_OK)
{
emit p->promptScanStatusInfo(tr("create savepath failed: ") + getLogInfo(ret), true);
}
QString scanFileName;
while (1)
{
scanFileName = savePath + p->m_aquireIntoSaveParam.m_fileNamePrefix + QString("%1.%2")
.arg(p->m_aquireIntoSaveParam.m_fileNameStartIndex, p->m_aquireIntoSaveParam.m_fileNameDigits, 10, QLatin1Char('0'))
.arg(p->m_aquireIntoSaveParam.m_fileNameExt);
QFileInfo fileInfo(scanFileName);
if (fileInfo.isFile())
{
++p->m_aquireIntoSaveParam.m_fileNameStartIndex;
}
else
{
break;
}
}
HGImgFmtSaveInfo saveInfo;
saveInfo.jpegQuality = (HGUInt)p->m_aquireIntoSaveParam.m_jpegQuality;
saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_NONE;
saveInfo.tiffJpegQuality = (HGUInt)p->m_aquireIntoSaveParam.m_tiffQuality;
HGImageInfo imgInfo;
HGBase_GetImageInfo(img, &imgInfo);
if (HGBASE_IMGTYPE_BINARY == imgInfo.type)
{
if (1 == p->m_aquireIntoSaveParam.m_tiffCompressionBW)
saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_LZW;
else if (2 == p->m_aquireIntoSaveParam.m_tiffCompressionBW)
saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_CCITTFAX4;
}
else
{
if (1 == p->m_aquireIntoSaveParam.m_tiffCompression)
saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_LZW;
else if (2 == p->m_aquireIntoSaveParam.m_tiffCompression)
saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_JPEG;
}
ret = saveImage(img, &saveInfo, p->m_aquireIntoSaveParam.m_isOcr, 0, getStdString(scanFileName).c_str());
if(ret == HGBASE_ERR_OK)
{
emit p->addNewImage(scanFileName);
++p->m_aquireIntoSaveParam.m_fileNameStartIndex;
}
else
{
emit p->promptScanStatusInfo(tr("save image doc failed: ") + getLogInfo(ret), true);
}
}
}
p->m_currScanCount++;
HGBase_DestroyImage(img);
if(statu == SANE_Image_Statu_OK)
p->m_dialogLog->image_received_from_scanner();
} }
} }
break; break;

View File

@ -125,6 +125,10 @@ signals:
void scan_working(QString workingInfo); void scan_working(QString workingInfo);
void scan_finish(QString finishInfo, int err); void scan_finish(QString finishInfo, int err);
void fwUpgradeAndDevLock_Finish(); void fwUpgradeAndDevLock_Finish();
void addNewImage(const QString& filename);
void wrong_image(const QString& fileName, int status);
void determineMemory();
void promptScanStatusInfo(QString info, bool error);
private slots: private slots:
void on_AcquireInto2(); void on_AcquireInto2();
@ -153,6 +157,10 @@ private slots:
void on_scan_working(QString workingInfo); void on_scan_working(QString workingInfo);
void on_scan_finish(QString finishInfo, int err); void on_scan_finish(QString finishInfo, int err);
void on_fwUpgradeAndDevLock_Finish(); void on_fwUpgradeAndDevLock_Finish();
void on_addNewImage(const QString& filename);
void on_wrong_image(const QString& fileName, int status);
void on_determineMemory();
void on_promptScanStatusInfo(QString info, bool error);
void on_export_scanned_image(void); void on_export_scanned_image(void);
void on_continueScan(); void on_continueScan();
void on_stopScan(); void on_stopScan();