找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 79098|回复: 26

[文件操作] 批处理如何在近万张图片中找到分辨率最大的一张图片?

[复制链接]
发表于 2014-9-13 15:19:20 | 显示全部楼层 |阅读模式
  1.       @echo off
  2.         set %mW%=0
  3.         set %mH%=0
  4.         for /f "delims=" %%a in ('dir /b /s /a-d *.jpg *.png *.bmp') do (
  5.         for /f "tokens=1,3" %%i in ('nconvert.exe -info "%%a" ^| findstr "Width Height"') do (        
  6.         set  %W%=Width
  7.         set  %H%=Height
  8.         if %W% gtr %mW%
  9.         set  %mW%=Width
  10.         if %H% gtr %mH%
  11.         set  %mH%=Height      
  12.         )
  13.         )
  14.         pause
复制代码
我写的是这样的 可是无法运行……
 楼主| 发表于 2014-9-13 15:41:07 | 显示全部楼层
  1.     @echo off
  2.     setlocal enabledelayedexpansion
  3.         for /f "delims=" %%a in ('dir /b /s /a-d *.jpg *.png *.bmp') do (
  4.         for /f "tokens=1,3" %%i in ('nconvert.exe -info "%%a" ^| findstr "Width Height"') do (
  5. set "%%i=%%j"      

  6.         set  %W%=Width
  7.         set  %H%=Height
  8.         if %W% gtr %mW%
  9.         set  %mW%=Width
  10.         if %H% gtr %mH%
  11.         set  %mH%=Height      
  12.         )        
  13.         pause
复制代码
这样子也不行……
发表于 2014-9-13 16:14:24 | 显示全部楼层
回复 2# tcasdsss

%var% 不是 BAT 里变量必须采用的命名方式, 当然这样的变量名也是合法的. 实际上变量名比较自由

绝大多数字符都可以用于命名变量, 诸如此类: @#$%  甚至汉字, 甚至可以用数字作为起始字符(当然不好了)

%var% 是变量扩展, 要取变量 var 的值时可以用 %var% 为其赋值时这样: set var=something

分辨率最大如何理解? 应该算面积吧. 即  WIDTH * HEIGHT 这个乘积最大的吧

在找到最大分辨率时, 应该把该文件的路径给存下来吧, 所以可以设一个变量 set theFile=%%a

另外 WINDOWS 系统详细查看方式中, 可以选出 尺寸 列, 点击一下列标头, 即可排序, 可以试试.
 楼主| 发表于 2014-9-13 16:19:13 | 显示全部楼层
回复 3# neorobin


    我说错了…… 我要找的是 宽和高的最大值
现在最悲剧的是无法运行……
 楼主| 发表于 2014-9-13 16:22:56 | 显示全部楼层
回复 3# neorobin
  1.         set  W=Width
  2.         set  H=Height
  3. if  %W% gtr %mW%  
  4. set mW=Width
  5. if  %H% gtr %mH%  
  6. set mH=Height
复制代码
这样子赋值是不行的……
发表于 2014-9-13 16:31:13 | 显示全部楼层
回复 5# tcasdsss

nconvert.exe -info imagefile.jpg 输出信息格式是怎样的?
 楼主| 发表于 2014-9-13 16:41:54 | 显示全部楼层
本帖最后由 tcasdsss 于 2014-9-13 16:44 编辑

回复 6# neorobin
  1. for /f "tokens=1,3" %%i in ('nconvert.exe -info "%%a" ^| findstr "Width Height"') do (
复制代码
这句我是借鉴别人的……
他的方法输出的 宽和高是正确的

新建位图图像 (2)-.jpg
发表于 2014-9-13 17:12:05 | 显示全部楼层
  1. @set @n=0/*&echo off
  2. for /f "delims=" %%a in ('dir /b *.jpg ^| cscript -nologo -e:jscript "%~0"') do (
  3.         echo 在这里对 %%a 做你想做的操作...
  4. )
  5. pause &exit /b */

  6. var Img = new ActiveXObject("WIA.ImageFile")
  7. var px
  8. var list = {max:0,files:[]}

  9. while(!WScript.StdIn.AtEndOfStream){
  10.     var file = WScript.StdIn.ReadLine()
  11.         Img.LoadFile(file)
  12.        
  13.         px = Img.Width * Img.Height
  14.        
  15.         if(px > list.max){
  16.                 list.max = px
  17.                 list.files = [file]
  18.         } else {
  19.                 list.files.push(file)
  20.         }
  21. }

  22. for(var i in list.files){
  23.         WScript.Echo(list.files[i])
  24. }
复制代码
 楼主| 发表于 2014-9-13 17:16:27 | 显示全部楼层
回复 8# CrLf


    不懂……
好像一部分不是批处理
这个怎么才能获得最大宽度 和高度的数据呢?
 楼主| 发表于 2014-9-13 17:20:35 | 显示全部楼层
回复 8# CrLf


    我现在想法是利用一个bat先找到这些图片中最大宽度和高度的数据 再call 另一个bat文件将变量传过去 通过nconvert来将图片分变率用canvas调整到最大值
发表于 2014-9-13 17:34:32 | 显示全部楼层
回复 7# tcasdsss

你的代码中有一个全角括号
  1. @echo off & setlocal enabledelayedexpansion
  2. set /a Width=0, Height=0
  3. for /f "delims=" %%a in ('dir /b /s /a-d *.jpg *.png *.bmp') do (
  4.         for /f "tokens=1,3" %%i in ('nconvert.exe -info "%%a" ^| findstr "Width Height"') do (
  5.                 if %%j gtr !%%i! set "%%i=%%j"
  6.         )
  7. )

  8. set Width
  9. set Height
  10. pause
复制代码
发表于 2014-9-13 17:39:55 | 显示全部楼层
虽然赶脚不需要我了,但还是改着玩玩...
  1. @set @n=0/*&echo off
  2. dir /b *.jpg | cscript -nologo -e:jscript "%~0" "格式化输出:高度[$height] 宽度[$width] 像素[$px] 文件[\'$file\']"
  3. rem 按指定格式输出取得的信息
  4. pause

  5. for /f "delims=" %%a in ('dir /b *.jpg ^| cscript -nologo -e:jscript "%~0"') do (
  6.         echo 在这里对 %%a 做你想做的操作...
  7. )
  8. rem 处理示例
  9. pause &exit /b */

  10. var format = '$file'
  11. if(WScript.Arguments.length){
  12.         format = WScript.Arguments.Item(0).replace(/\$\$/g,'{$$$$}')
  13.         format = format.replace(/\\r/g,'\r')
  14.         format = format.replace(/\\n/g,'\n')
  15.         format = format.replace(/\\t/g,'\t')
  16.         format = format.replace(/\\'/g,'"')
  17. }

  18. var Img = new ActiveXObject("WIA.ImageFile")
  19. var px
  20. var list = {px:0,files:[]}

  21. while(!WScript.StdIn.AtEndOfStream){
  22.     var file = WScript.StdIn.ReadLine()
  23.         Img.LoadFile(file)
  24.        
  25.         px = Img.Width * Img.Height
  26.        
  27.         if(px > list.px){
  28.                 list = {px:px,width:Img.Width,height:Img.Height,files:[file]}
  29.         } else {
  30.                 list.files.push(file)
  31.         }
  32. }

  33. var output = format.replace(/\$px/gi,list.px)
  34.         output = output.replace(/\$height/gi,list.height)
  35.         output = output.replace(/\$width/gi,list.width)
  36.        
  37. for(var i in list.files){
  38.         output = output.replace(/\$file/gi,list.files[i])
  39.         WScript.Echo(output.replace(/\{\$\$\}/gi,'$$$$'))
  40. }
复制代码
支持简单的格式化输出
发表于 2014-9-13 17:42:48 | 显示全部楼层
话说楼主你把 height 和 width 分开判断,怎么能保证是同一张图片的高和宽呢?
 楼主| 发表于 2014-9-13 17:46:32 | 显示全部楼层
回复 13# CrLf


    我现在目的是要把一批图片压缩成hevc流文件 以提高压缩率 为了保证视频可以符合hevc流的要求 又不损失数据 我们就要把 图片中的最长最高的值得到 从而方便hevc压缩
 楼主| 发表于 2014-9-13 17:47:09 | 显示全部楼层
回复 11# neorobin


    吊…… 比我的简洁好多……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 02:32 , Processed in 0.040117 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表