标题: [文件操作] 批处理如何在近万张图片中找到分辨率最大的一张图片? [打印本页]
作者: tcasdsss 时间: 2014-9-13 15:19 标题: 批处理如何在近万张图片中找到分辨率最大的一张图片?
- @echo off
- set %mW%=0
- set %mH%=0
- for /f "delims=" %%a in ('dir /b /s /a-d *.jpg *.png *.bmp') do (
- for /f "tokens=1,3" %%i in ('nconvert.exe -info "%%a" ^| findstr "Width Height"') do (
- set %W%=Width
- set %H%=Height
- if %W% gtr %mW%
- set %mW%=Width
- if %H% gtr %mH%
- set %mH%=Height
- )
- )
- pause
复制代码
我写的是这样的 可是无法运行……
作者: tcasdsss 时间: 2014-9-13 15:41
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b /s /a-d *.jpg *.png *.bmp') do (
- for /f "tokens=1,3" %%i in ('nconvert.exe -info "%%a" ^| findstr "Width Height"') do (
- set "%%i=%%j"
- )
- set %W%=Width
- set %H%=Height
- if %W% gtr %mW%
- set %mW%=Width
- if %H% gtr %mH%
- set %mH%=Height
- )
- pause
复制代码
这样子也不行……
作者: neorobin 时间: 2014-9-13 16:14
回复 2# tcasdsss
%var% 不是 BAT 里变量必须采用的命名方式, 当然这样的变量名也是合法的. 实际上变量名比较自由
绝大多数字符都可以用于命名变量, 诸如此类: @#$% 甚至汉字, 甚至可以用数字作为起始字符(当然不好了)
%var% 是变量扩展, 要取变量 var 的值时可以用 %var% 为其赋值时这样: set var=something
分辨率最大如何理解? 应该算面积吧. 即 WIDTH * HEIGHT 这个乘积最大的吧
在找到最大分辨率时, 应该把该文件的路径给存下来吧, 所以可以设一个变量 set theFile=%%a
另外 WINDOWS 系统详细查看方式中, 可以选出 尺寸 列, 点击一下列标头, 即可排序, 可以试试.
作者: tcasdsss 时间: 2014-9-13 16:19
回复 3# neorobin
我说错了…… 我要找的是 宽和高的最大值
现在最悲剧的是无法运行……
作者: tcasdsss 时间: 2014-9-13 16:22
回复 3# neorobin - set W=Width
- set H=Height
- if %W% gtr %mW%
- set mW=Width
- if %H% gtr %mH%
- set mH=Height
复制代码
这样子赋值是不行的……
作者: neorobin 时间: 2014-9-13 16:31
回复 5# tcasdsss
nconvert.exe -info imagefile.jpg 输出信息格式是怎样的?
作者: tcasdsss 时间: 2014-9-13 16:41
本帖最后由 tcasdsss 于 2014-9-13 16:44 编辑
回复 6# neorobin - for /f "tokens=1,3" %%i in ('nconvert.exe -info "%%a" ^| findstr "Width Height"') do (
复制代码
这句我是借鉴别人的……
他的方法输出的 宽和高是正确的
[attach]7670[/attach]
作者: CrLf 时间: 2014-9-13 17:12
- @set @n=0/*&echo off
- for /f "delims=" %%a in ('dir /b *.jpg ^| cscript -nologo -e:jscript "%~0"') do (
- echo 在这里对 %%a 做你想做的操作...
- )
- pause &exit /b */
-
- var Img = new ActiveXObject("WIA.ImageFile")
- var px
- var list = {max:0,files:[]}
-
- while(!WScript.StdIn.AtEndOfStream){
- var file = WScript.StdIn.ReadLine()
- Img.LoadFile(file)
-
- px = Img.Width * Img.Height
-
- if(px > list.max){
- list.max = px
- list.files = [file]
- } else {
- list.files.push(file)
- }
- }
-
- for(var i in list.files){
- WScript.Echo(list.files[i])
- }
复制代码
作者: tcasdsss 时间: 2014-9-13 17:16
回复 8# CrLf
不懂……
好像一部分不是批处理
这个怎么才能获得最大宽度 和高度的数据呢?
作者: tcasdsss 时间: 2014-9-13 17:20
回复 8# CrLf
我现在想法是利用一个bat先找到这些图片中最大宽度和高度的数据 再call 另一个bat文件将变量传过去 通过nconvert来将图片分变率用canvas调整到最大值
作者: neorobin 时间: 2014-9-13 17:34
回复 7# tcasdsss
你的代码中有一个全角括号- @echo off & setlocal enabledelayedexpansion
- set /a Width=0, Height=0
- for /f "delims=" %%a in ('dir /b /s /a-d *.jpg *.png *.bmp') do (
- for /f "tokens=1,3" %%i in ('nconvert.exe -info "%%a" ^| findstr "Width Height"') do (
- if %%j gtr !%%i! set "%%i=%%j"
- )
- )
-
- set Width
- set Height
- pause
复制代码
作者: CrLf 时间: 2014-9-13 17:39
虽然赶脚不需要我了,但还是改着玩玩...- @set @n=0/*&echo off
- dir /b *.jpg | cscript -nologo -e:jscript "%~0" "格式化输出:高度[$height] 宽度[$width] 像素[$px] 文件[\'$file\']"
- rem 按指定格式输出取得的信息
- pause
-
- for /f "delims=" %%a in ('dir /b *.jpg ^| cscript -nologo -e:jscript "%~0"') do (
- echo 在这里对 %%a 做你想做的操作...
- )
- rem 处理示例
- pause &exit /b */
-
- var format = '$file'
- if(WScript.Arguments.length){
- format = WScript.Arguments.Item(0).replace(/\$\$/g,'{$$$$}')
- format = format.replace(/\\r/g,'\r')
- format = format.replace(/\\n/g,'\n')
- format = format.replace(/\\t/g,'\t')
- format = format.replace(/\\'/g,'"')
- }
-
- var Img = new ActiveXObject("WIA.ImageFile")
- var px
- var list = {px:0,files:[]}
-
- while(!WScript.StdIn.AtEndOfStream){
- var file = WScript.StdIn.ReadLine()
- Img.LoadFile(file)
-
- px = Img.Width * Img.Height
-
- if(px > list.px){
- list = {px:px,width:Img.Width,height:Img.Height,files:[file]}
- } else {
- list.files.push(file)
- }
- }
-
- var output = format.replace(/\$px/gi,list.px)
- output = output.replace(/\$height/gi,list.height)
- output = output.replace(/\$width/gi,list.width)
-
- for(var i in list.files){
- output = output.replace(/\$file/gi,list.files[i])
- WScript.Echo(output.replace(/\{\$\$\}/gi,'$$$$'))
- }
复制代码
支持简单的格式化输出
作者: CrLf 时间: 2014-9-13 17:42
话说楼主你把 height 和 width 分开判断,怎么能保证是同一张图片的高和宽呢?
作者: tcasdsss 时间: 2014-9-13 17:46
回复 13# CrLf
我现在目的是要把一批图片压缩成hevc流文件 以提高压缩率 为了保证视频可以符合hevc流的要求 又不损失数据 我们就要把 图片中的最长最高的值得到 从而方便hevc压缩
作者: tcasdsss 时间: 2014-9-13 17:47
回复 11# neorobin
吊…… 比我的简洁好多……
作者: CrLf 时间: 2014-9-13 17:48
回复 14# tcasdsss
噢,怪不得,那当我啥都没发好了...
作者: tcasdsss 时间: 2014-9-13 17:53
本帖最后由 tcasdsss 于 2014-9-13 18:02 编辑
回复 11# neorobin - @echo off & setlocal enabledelayedexpansion
- set /a Width=0, Height=0
- for /f "delims=" %%i in ('dir /s /a-d /b "%folder%" ^| findstr /i "jpg$ png$ bmp$"') do (
- for /f "tokens=1,3" %%i in ('nconvert.exe -info "%%a" ^| findstr "Width Height"') do (
- if %%j gtr !%%i! set "%%i=%%j"
- )
- )
- set Width
- set Height
- call 1.bat
- pause
复制代码
这样就不能用了…… 加入了别人的检索代码之后
我知道哪错了……
作者: tcasdsss 时间: 2014-9-13 17:55
回复 16# CrLf
我准备把他合成为一个转图片 音频的bat集 以后没准你也会用得上
作者: tcasdsss 时间: 2014-9-13 17:59
我其实没做什么 就是一直在问而已……
作者: tcasdsss 时间: 2014-9-13 18:01
回复 11# neorobin
现在这个命令只能在一个目录下才可以 我希望他可以弄到所有子目录下 就完美了
作者: neorobin 时间: 2014-9-13 18:02
回复 17# tcasdsss
第 3 行 的 %%i 和 第 4 行 的 %%a 不对应, 当然出问题了, %%a 无定义了!
作者: tcasdsss 时间: 2014-9-13 18:03
回复 21# neorobin
%folder%我也错了……
作者: neorobin 时间: 2014-9-13 18:05
回复 22# tcasdsss
folder 你事先给它赋上正确的值就 OK
作者: tcasdsss 时间: 2014-9-13 18:07
本帖最后由 tcasdsss 于 2014-9-13 18:13 编辑
回复 23# neorobin
利用跳转 可不可以把所有的bat合成一个? 我怕变量不对
可以! 那边量怎么清空呢? 直接赋值为0?
作者: tcasdsss 时间: 2014-9-13 18:44
本帖最后由 tcasdsss 于 2014-9-13 19:34 编辑
回复 21# neorobin
搞定了
虽然毫无美感……复制代码
问题解决 就差精简代码了……
作者: neorobin 时间: 2014-9-13 18:49
回复 24# tcasdsss
set "var=" 即可, 双引号不是必要的, 但要保证 = 后面没有尾随空格之类的字符
作者: tcasdsss 时间: 2014-9-13 19:00
本帖最后由 tcasdsss 于 2014-9-13 19:31 编辑
回复 26# neorobin
你试一下 现在我的代码有点毛病 压缩视频流会变成 压缩完后还会重复压……
没问题了……
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |