图像辅助处理-针对扫描册子(A3与A4混合)
文章目录
图像辅助处理-针对扫描册子(A3与A4混合)针对问题扫描小册子的图像特点:
处理方式方法:方法1:一件一页手动处理方法1的缺点:
方法2:直接全部分割方法2的缺点:
方法3:特殊处理方法3处理工程和步骤:五步图像处理:第一步:分类小册子文件和其他文件第二步:分离小册子的A4和A3文件第三步:对A3图像进行分割处理和重命名处理第四步:对分离的小册子图像进行重命名处理第五步:合并开始分离的A4图像和分割之后的A4图像文件
BAT使用方法
BAT代码小知识补充判断
针对问题
针对扫描册子扫描的处理,小册子(薄册子)类似学籍或者档案信息的册子,一整个可以通过扫描仪
扫描小册子的图像特点:
扫描时第一页和最后一页一般是A4图像大小里面的图像都是扫描A3大小(需要处理)一个小册子一个文件夹
我们需要进行图像处理将全部变为A4大小图像并且保证图像顺序正确
一般这种一个册子页数都是固定的一般是8面或者10面,可以设法进行批量处理
换句话说,除了第一页和最后一页不用进行分割操作,中间页的扫描A3图像要进行分割处理,然后保证页面顺序不会错误。
处理方式方法:
一件一页手动处理直接全部分割进行一些特殊处理
列出处理三种方法,换句话说当时我遇到这些问题时思考的三种方法,先来说每个方法。
方法1:一件一页手动处理
方法1直接自己手动处理,遇到A3就手动裁开,首先基本裁完就处理完了,基本不会出太大问题。
方法1的缺点:
消耗时间是最大的,取决于你裁开工具是否好用,或者说裁剪操作能不能快捷键一步到位,如果还需要点击操作那就特别耗时。
方法2:直接全部分割
方法2直接全部分割,就是对于这些图像直接全部进行裁开操作,相比于方法1省时,首先自己不用自己一个个处理,当它批量裁开的时候自己也能进行其他的工作,但是这个方法有两个缺点。
方法2的缺点:
全部裁开之后容易**“误伤”**,之前本来是A4的图像会被你裁开成两个图像。
例如首页和最后一页,全部裁开之后还要自己过一遍,针对原来就是A4然后被裁开成两个图像的进行处理,要么自己手动拼接回来,要么裁开之前备份图像,处理完之后删除裁开的图像然后复制备份图像替换补充
这种文件中不只是全是小册,还有其他文件图像,其他文件也存在全部是A4的情况。
也是裁开之后需要再处理,处理方法和上同
方法3:特殊处理
经过长时间的摸索,对于这类图像的处理总结了一套处理方法(因为处理工具拼接和手动分割使用不便利),当然在处理工具拼接和手动分割使用便利的情况下,方法1和方法2也不乏是个好方法
方法3处理工程和步骤:
五步图像处理:
分类小册子文件和其他文件(A4居多)分离小册子的A4和A3文件对A3图像进行分割处理和重命名处理对分离的小册子图像进行重命名处理合并开始分离的A4图像和分割之后的A4图像文件
对于这些步骤除了图像分割,其他的都可以使用bat脚本实现,bat脚本不用配置环境,基本上Windows系统都能运行处理。列出部分脚本
第一步:分类小册子文件和其他文件
通过图像个数进行分类,小册子图像个数都是一样,其他文件个数大部分和小册子图像个数不一样
@echo off
setlocal enabledelayedexpansion
REM 获取批处理文件所在的目录路径
set "current_folder=%~dp0"
REM 定义源文件夹A的路径
set "source_folder=%current_folder%"
REM 定义目标文件夹six和notsix的路径
set "target_folder_six=%source_folder%\six"
set "target_folder_notsix=%source_folder%\notsix"
REM 创建目标文件夹six和notsix
if not exist "%target_folder_six%" mkdir "%target_folder_six%"
if not exist "%target_folder_notsix%" mkdir "%target_folder_notsix%"
REM 遍历源文件夹A下的所有子文件夹
for /d %%d in ("%source_folder%\*") do (
REM 确保我们在处理子文件夹,并且不是新创建的six和notsix文件夹
if "%%~nxd" neq "six" && "%%~nxd" neq "notsix" (
REM 统计子文件夹中的.jpg文件数量
set "jpg_count=0"
for %%f in ("%%d\*.jpg") do (
set /a jpg_count+=1
)
REM 根据.jpg文件数量进行分类
if !jpg_count! equ 6 (
move "%%d" "%target_folder_six%"
) else (
move "%%d" "%target_folder_notsix%"
)
)
)
echo 文件分类完成!
pause
第二步:分离小册子的A4和A3文件
对每个小册子文件夹里面的文件进行重命名从0001.jpg到最后,假设最后一页是0006.jpg,那么重命名之后小册子文件夹中的0001.jpg和0006.jpg就是A4图像,0002.jpg到0005.jpg就是A3图像
@echo off
setlocal enabledelayedexpansion
REM 获取批处理文件所在的目录路径
set "current_folder=%~dp0"
REM 定义源文件夹A的路径
set "source_folder=%current_folder%"
REM 定义目标文件夹16和2-5的路径
set "target_folder_16=%source_folder%\16"
set "target_folder_2_5=%source_folder%\2-5"
REM 创建目标文件夹16和2-5
if not exist "%target_folder_16%" mkdir "%target_folder_16%"
if not exist "%target_folder_2_5%" mkdir "%target_folder_2_5%"
REM 遍历源文件夹A下的所有子文件夹
for /d %%d in ("%source_folder%\*") do (
REM 排除当前目录和父目录以及目标文件夹16和2-5
if "%%~nxd" neq "." if "%%~nxd" neq ".." if "%%~nxd" neq "16" if "%%~nxd" neq "2-5" (
REM 获取子文件夹名称
set "subfolder_name=%%~nxd"
REM 创建子文件夹16和2-5中的对应子文件夹
if not exist "%target_folder_16%\!subfolder_name!" mkdir "%target_folder_16%\!subfolder_name!"
if not exist "%target_folder_2_5%\!subfolder_name!" mkdir "%target_folder_2_5%\!subfolder_name!"
REM 移动0001.jpg和0006.jpg到目标文件夹16中的对应子文件夹
if exist "%%d\0001.jpg" (
move "%%d\0001.jpg" "%target_folder_16%\!subfolder_name!\"
)
if exist "%%d\0006.jpg" (
move "%%d\0006.jpg" "%target_folder_16%\!subfolder_name!\"
)
REM 移动0002.jpg、0003.jpg、0004.jpg、0005.jpg到目标文件夹2-5中的对应子文件夹
if exist "%%d\0002.jpg" (
move "%%d\0002.jpg" "%target_folder_2_5%\!subfolder_name!\"
)
if exist "%%d\0003.jpg" (
move "%%d\0003.jpg" "%target_folder_2_5%\!subfolder_name!\"
)
if exist "%%d\0004.jpg" (
move "%%d\0004.jpg" "%target_folder_2_5%\!subfolder_name!\"
)
if exist "%%d\0005.jpg" (
move "%%d\0005.jpg" "%target_folder_2_5%\!subfolder_name!\"
)
REM 检查子文件夹是否为空,如果为空则删除它
set "isEmpty=1"
for %%f in ("%%d\*") do (
if exist "%%f" (
set "isEmpty=0"
goto :notEmpty
)
)
:notEmpty
if !isEmpty! equ 1 (
rd "%%d"
)
REM 输出提示信息
echo 已处理文件夹 %%~nxd
)
)
echo 所有文件夹处理完成!
pause
第三步:对A3图像进行分割处理和重命名处理
分割找寻相关软件操作
重命名步骤二分割的图像重命名从0002.jpg到0008.jpg,最好使用重命名的相关软件
@echo off
setlocal enabledelayedexpansion
REM 获取批处理文件所在的目录路径
set "parent_folder=%~dp0"
REM 临时文件名前缀
set "temp_prefix=tmp_"
REM 遍历主文件夹下的所有子文件夹
for /d %%d in ("%parent_folder%\*") do (
REM 确保我们在处理子文件夹
if "%%~nxd" neq "." if "%%~nxd" neq ".." (
set "file_counter=2"
REM 临时重命名文件,避免文件名冲突
for %%f in ("%%d\*.jpg") do (
set "temp_name=!temp_prefix!%%~nxf"
rename "%%f" "!temp_name!"
if errorlevel 1 echo 临时重命名 "%%f" 失败
)
REM 将临时文件重命名为目标文件名
for %%f in ("%%d\!temp_prefix!*.jpg") do (
set "new_name=000!file_counter!.jpg"
if !file_counter! geq 10 (
set "new_name=00!file_counter!.jpg"
)
rename "%%f" "!new_name!"
if errorlevel 1 echo 重命名 "%%f" 失败
set /a file_counter+=1
)
REM 输出提示信息
echo 已处理文件夹 %%~nxd
)
)
echo 所有文件处理完成!
pause
第四步:对分离的小册子图像进行重命名处理
对原始A4进行处理,将原始0006.jpg重命名为0010.jpg,重命名的所有原因都是保证合并之后所有图像顺序正确
@echo off
setlocal enabledelayedexpansion
REM 获取批处理文件所在的目录路径
set "parent_folder=%~dp0"
REM 遍历主文件夹下的所有子文件夹
for /d %%d in ("%parent_folder%\*") do (
REM 确保我们在处理子文件夹
if exist "%%d\0006.jpg" (
REM 将0006.jpg重命名为0010.jpg
rename "%%d\0006.jpg" "0010.jpg"
echo 已在文件夹 %%~nxd 中将0006.jpg重命名为0010.jpg
)
)
echo 所有文件处理完成!
pause
第五步:合并开始分离的A4图像和分割之后的A4图像文件
这里自己手动复制过去一样就行,写脚本感觉太花里胡哨没必要
@echo off
setlocal enabledelayedexpansion
REM 定义文件夹M、a和b的路径
set "M_folder=%~dp0"
set "a_folder=%M_folder%\2-5"
set "b_folder=%M_folder%\16"
REM 遍历文件夹a下的所有子文件夹
for /d %%d in ("%a_folder%\*") do (
REM 获取子文件夹名称
set "subfolder_name=%%~nxd"
REM 检查文件夹b下是否存在同名子文件夹
if exist "%b_folder%\!subfolder_name!" (
REM 创建目标文件夹M下的对应子文件夹
if not exist "%M_folder%\!subfolder_name!" mkdir "%M_folder%\!subfolder_name!"
REM 合并文件夹a和文件夹b中的内容到目标文件夹M下的对应子文件夹
xcopy "%a_folder%\!subfolder_name!\*" "%M_folder%\!subfolder_name!\" /s /e /y
xcopy "%b_folder%\!subfolder_name!\*" "%M_folder%\!subfolder_name!\" /s /e /y
REM 删除源文件夹a和b中的对应子文件夹
rd /s /q "%a_folder%\!subfolder_name!"
rd /s /q "%b_folder%\!subfolder_name!"
REM 输出提示信息
echo 已合并文件夹 !subfolder_name!
)
)
REM 删除空文件夹16和2-5,并输出提示信息
rd /s /q "%a_folder%"
rd /s /q "%b_folder%"
echo 所有文件夹处理完成!
pause
BAT使用方法
将代码复制到txt文本文件
点击另存为,然后将txt后缀改为bat,编码改为ANSI,如图所示
得到bat文件之后放到小册子路径下双击运行
BAT代码小知识补充
原文链接:https://blog.csdn.net/hfy1237/article/details/130123285
判断
在bat脚本中,if条件判断语句共有6种比较操作符,分别为
操作符描述全称equ等于equalneq不等于no equallss小于less thanleq小于等于less than or equalgtr大于greater thangeq大于等于greater than or equal
:: 创建文件
echo Hello > myfile.txt
:: 复制文件
copy source.txt destination.txt
:: 移动文件
move source.txt destination_folder\
:: 重命名文件
ren oldname.txt newname.txt
:: 删除文件
del myfile.txt
:: 判断文件是否存在
set "filePath=C:\path\to\your\file.txt"
if exist "%filePath%" (
echo 文件存在
) else (
echo 文件不存在
)
%~I - 删除任何引号("),扩展 %I
%~fI - 将 %I 扩展到一个完全合格的路径名
%~dI - 仅将 %I 扩展到一个驱动器号
%~pI - 仅将 %I 扩展到一个路径
%~nI - 仅将 %I 扩展到一个文件名
%~xI - 仅将 %I 扩展到一个文件扩展名
%~sI - 扩展的路径只含有短名
%~aI - 将 %I 扩展到文件的文件属性
%~tI - 将 %I 扩展到文件的日期/时间
%~zI - 将 %I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩展到
空字符串
删除一个目录。
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S 除目录本身外,还将删除指定目录下的所有子目录和
文件。用于删除目录树。
/Q 安静模式,带 /S 删除目录树时不要求确认
删除一个或多个文件。
DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
names 指定一个或多个文件或者目录列表。
通配符可用来删除多个文件。
如果指定了一个目录,该目录中的所
有文件都会被删除。
/P 删除每一个文件之前提示确认。
/F 强制删除只读文件。
/S 删除所有子目录中的指定的文件。
/Q 安静模式。删除全局通配符时,不要求确认
/A 根据属性选择要删除的文件
属性 R 只读文件 S 系统文件
H 隐藏文件 A 准备存档的文件
I 无内容索引文件 L 重新分析点
O 脱机文件 - 表示“否”的前缀
如果命令扩展被启用,DEL 和 ERASE 更改如下:
/S 开关的显示句法会颠倒,即只显示已经
删除的文件,而不显示找不到的文件。
// 操作字符串(x是开始位置,y是取得字符数) 语法
//echo %time:~x,y%
// bat脚本获取日期2023/02/12
echo %date:~0,10%
// bat脚本获取时间10:12:08
echo %time:~0,8%
// 输出带时间的log日志
set hour=%time:~0,2%
if %hour% LSS 10 (set hour=0%time:~1,1%)
set filename=%date:~0,4%%date:~5,2%%date:~8,2%_%hour%%time:~3,2%%time:~6,2%
echo 123 > %filename%.log
以下是一些参数的用法和含义:
/d 参数:用于遍历目录(文件夹),不会递归地遍历子目录,除非与 /r 结合使用。
格式:FOR /D %%I IN (Command1) DO Command2用法:只搜索文件夹,不搜索文件。只搜索指定目录,不搜索子目录。例如:搜索C盘下的所有目录:@echo off
for /d %%i in (c:/\*) do echo %%i
pause
运行结果是显示C盘下所有的文件夹名字,但不包含子目录。 /r 参数:用于递归地遍历目录树,可以遍历文件和目录。
格式:FOR /R [[drive:]path] %%I IN (set) DO command [command-parameters]用法:遍历所有地址搜索文件,包括搜索所有子目录。例如:搜索当前目录下的所有文件:@echo off
for /r %%i in (*) do echo %%i
pause
运行结果将显示当前目录下的所有文件以及该目录下所有子目录里的所有文件。 /l 参数:用于执行数字循环,可以指定起始值、结束值和步长。
格式:FOR /L %%I IN (start,step,end) DO Command用法:输出一个从起始值到结束值的数字序列,每个数字之间相差步长。例如:输出一个从 1 到 10 的数字序列:@echo off
for /l %%i in (1,1,10) do @echo %%i
命令会输出1到10的数字。 /f 参数:用于处理文件内容或字符串,支持多种格式的分隔符和令牌(tokens)。
格式:FOR /F ["options"] %%I IN (file-set) DO command [command-parameters]用法:可以对文件中的每一行或者字符串进行处理,常用于读取文件内容。例如:读取文件内容并输出:@echo off
for /f "delims=" %%a in (file.txt) do @echo %%a
命令会逐行读取 file.txt 文件的内容并输出。 输出一个从起始值到结束值的数字序列,每个数字之间相差步长。例如:输出一个从 1 到 10 的数字序列:@echo off
for /l %%i in (1,1,10) do @echo %%i
命令会输出1到10的数字。 /f 参数:用于处理文件内容或字符串,支持多种格式的分隔符和令牌(tokens)。
格式:FOR /F ["options"] %%I IN (file-set) DO command [command-parameters]用法:可以对文件中的每一行或者字符串进行处理,常用于读取文件内容。例如:读取文件内容并输出:@echo off
for /f "delims=" %%a in (file.txt) do @echo %%a
命令会逐行读取 file.txt 文件的内容并输出。