Board logo

标题: [文本处理] [已解决]批处理获取图片分辨率的问题 [打印本页]

作者: 灯塔彭于晏    时间: 2020-12-28 14:54     标题: [已解决]批处理获取图片分辨率的问题

在百度中寻求到的#获取图片分辨率信息#的批处理,不用额外其他软件,还挺好的。
但输出结果中,图片会按照名字,重新自动排列顺序,请问这一点该怎么改呢?

要求:我不想它重新排列,请保持桌面顺序,依次输出
谢谢您啦~
  1. @echo off & title  
  2. setlocal enabledelayedexpansion
  3. set Pic=*.jp*g,*.png,*.bmp,*.gif
  4. call :CreatVBS
  5. (for %%a in (%Pic%) do (
  6.     for /f "tokens=1-3 delims=x" %%b in ('cscript -nologo "%tmp%\GetImgInfo.vbs" "%%~sa"') do (
  7.         echo %%~nxa %%~bx%%~c
  8.     )
  9. ))>图片信息.txt
  10. pause
  11. exit
  12. :CreatVBS
  13. (echo '获取图片文件的宽、高、DPI
  14. echo On Error Resume Next
  15. echo Dim Img
  16. echo Set Img = CreateObject^("WIA.ImageFile"^)
  17. echo Img.LoadFile WScript.Arguments^(0^)
  18. echo Wscript.Echo Img.Width ^& "x" ^& Img.Height ^& "x" ^& Img.HorizontalResolution)>"%tmp%\GetImgInfo.vbs"
  19. goto :eof
复制代码
可以从图片中看到,文本中的排序按序重排了~ ~谢谢您了
作者: Batcher    时间: 2020-12-28 15:17

回复 1# 灯塔彭于晏


    你希望改成什么效果呢?
作者: WHY    时间: 2020-12-28 15:59

本帖最后由 WHY 于 2020-12-30 21:31 编辑

for %%a in (%ext%) do ... 应该是先按%ext%中的扩展名排序、扩展名相同再按文件名排序的,先jpg,然后bmp,再然后png,
把第7行改成:
  1. (for /f "delims=" %%a in ('dir /b /on *.jpg,*.bmp,*.png,*.gif') do (
复制代码
试试行不行。
作者: WHY    时间: 2020-12-28 16:07

保存为 Test.js, 双击运行
  1. var Img = new ActiveXObject('WIA.ImageFile');
  2. var fso = new ActiveXObject('Scripting.FileSystemObject');
  3. var arr = [];
  4. var e = new Enumerator( fso.GetFolder('.').Files );
  5. for(;!e.atEnd();e.moveNext()){
  6.     var file = e.item().Name;
  7.     if( !/\.(?:jpg|bmp|png|gif)$/i.test(file) ) continue;
  8.     Img.LoadFile(file);
  9.     arr.push(file + ' ' + Img.Width + 'x' + Img.Height + 'x' + Img.HorizontalResolution);
  10. }
  11. fso.OpenTextFile('图片信息.txt', 2, true).WriteLine( arr.join('\r\n') );
  12. WSH.Echo('Done');
复制代码

作者: 灯塔彭于晏    时间: 2020-12-29 07:58

回复 2# Batcher


    抱歉,我没描述清楚。 我是想按照桌面的图片的顺序来输出结果,但代码的结果是重新排序了。 可以看截图,明显顺序和桌面是不一样的。
希望可以和桌面一样。
作者: ivor    时间: 2020-12-29 08:32

用powershell 更方便
  1. powershell "Add-Type -AssemblyName System.Drawing;dir *.jpg,*.bmp,*.png,*.gif |%{$_.Name,[System.Drawing.Image]::FromFile($_).size -join ' '}"
复制代码
微信图片_20201229083132.jpg {Width=1920, Height=887}
微信图片_20201229083143.jpg {Width=960, Height=1920}
微信图片_20201229083146.jpg {Width=887, Height=1920}
微信截图_20201229082837.png {Width=688, Height=527}

作者: Batcher    时间: 2020-12-29 08:44

回复 5# 灯塔彭于晏


    你先试试其他几个代码是否达到目标?
作者: 灯塔彭于晏    时间: 2020-12-29 09:01

回复 3# WHY


    好像不太可以。还是重新按数字的顺序,依次排列了。
作者: 灯塔彭于晏    时间: 2020-12-29 09:01

保存为 Test.js, 双击运行
WHY 发表于 2020-12-28 16:07



    的确有结果了,但还是按照文件名,重新排列了顺序。和桌面顺序不太一样。
作者: 灯塔彭于晏    时间: 2020-12-29 09:06

回复 7# Batcher


    都没有保持原有的顺序, 都重新依次排列了~~
作者: 灯塔彭于晏    时间: 2020-12-29 09:06

回复 6# ivor


    谢谢,辛苦了辛苦了,但我不会操作这个~
作者: Batcher    时间: 2020-12-29 10:05

回复 10# 灯塔彭于晏


首先你需要确认一下桌面上的图片文件是按照什么顺序排序的。
脚本处理文件的时候常见的处理顺序是:按照文件名顺序、按照修改日期顺序、等等。
如果你桌面上的图片排序没有任何规律,那么脚本处理后的顺序不一致是正常的、不可避免的。
作者: 灯塔彭于晏    时间: 2020-12-29 10:09

回复 12# Batcher


    一张张存的话,应该是“创建时间” 。嘻嘻。
作者: ivor    时间: 2020-12-29 10:38

回复 13# 灯塔彭于晏

可以按创建时间排序
  1. powershell "Add-Type -AssemblyName System.Drawing;dir *.jpg,*.bmp,*.png,*.gif | sort -Property CreationTime|%{$_.Name,[System.Drawing.Image]::FromFile($_).size -join ' '}"
复制代码

作者: 灯塔彭于晏    时间: 2020-12-29 10:41

回复 14# ivor


    怎么输出到文本呀? 我下了一个quicker,里面可以运行powershell,但是……没文本~
谢谢~
作者: Batcher    时间: 2020-12-29 11:23

回复 13# 灯塔彭于晏


顶楼代码第7行改成这样试试呢:
(for /f "delims=" %%a in ('dir /b /od *.jpg,*.bmp,*.png,*.gif') do (

或者这样:
(for /f "delims=" %%a in ('dir /b /o-d *.jpg,*.bmp,*.png,*.gif') do (
作者: 灯塔彭于晏    时间: 2020-12-29 11:32

回复 16# Batcher


    谢谢您。可以的。
作者: WHY    时间: 2020-12-29 19:04

本帖最后由 WHY 于 2021-1-3 14:42 编辑

如果确定是按创建时间排序,这样应该可以
Test.js
  1. var Img = new ActiveXObject('WIA.ImageFile');
  2. var fso = new ActiveXObject('Scripting.FileSystemObject');
  3. Date.prototype.format = function(){
  4.     var yy = this.getFullYear();
  5.     var MM = ( '' + (101 + this.getMonth())).substr(1);
  6.     var dd = ( '' + (100 + this.getDate())).substr(1);
  7.     var hh = ( '' + (100 + this.getHours())).substr(1);
  8.     var mm = ( '' + (100 + this.getMinutes())).substr(1);
  9.     var ss = ( '' + (100 + this.getSeconds())).substr(1);
  10.     return yy + MM + dd + hh + mm + ss;
  11. }
  12. var arr = [];
  13. var e = new Enumerator( fso.GetFolder('.').Files );
  14. for(;!e.atEnd();e.moveNext()){
  15.     var file = e.item().Name;
  16.     if( !/\.(?:jpg|bmp|png|gif)$/i.test(file) ) continue;
  17.     Img.LoadFile(file);
  18.     var dt = new Date(e.item().DateCreated).format();
  19.     arr.push( dt + ' ' + file + ' ' + Img.Width + "x" + Img.Height + "x" + Img.HorizontalResolution );
  20. }
  21. arr.sort();  //正序
  22. //arr.sort().reverse();  //逆序
  23. fso.OpenTextFile('图片信息.txt', 2, true).WriteLine( arr.join('\r\n').replace(/^\d+ /gm, '') );
  24. WSH.Echo('Done');
复制代码
修改顶楼的:
  1. @echo off
  2. set Pic=*.jpg,*.jpeg,*.png,*.bmp,*.gif
  3. call :CreatVBS
  4. dir /b /od /tc %Pic% | cscript //nologo "%tmp%\GetImgInfo.vbs" > PicInfo.txt
  5. pause & exit
  6. :CreatVBS
  7. (
  8.     echo '获取图片文件的宽、高、DPI
  9.     echo On Error Resume Next
  10.     echo Dim Img, file
  11.     echo Set Img = CreateObject("WIA.ImageFile"^)
  12.     echo while Not WSH.StdIn.AtEndOfStream
  13.     echo     file = WSH.StdIn.ReadLine
  14.     echo     Img.LoadFile file
  15.     echo     WSH.Echo file ^& " " ^& Img.Width ^& "x" ^& Img.Height ^& "x" ^& Img.HorizontalResolution
  16.     echo wend
  17. )>"%tmp%\GetImgInfo.vbs"
复制代码

作者: ivor    时间: 2020-12-29 20:24

我只写一部分代码
第一种用重定向最后面  >1.txt
第二种powershell输出到文本.size -join ' ' | out-file 1.txt
作者: terse    时间: 2020-12-29 20:46

  1. @set @i=0 /* & @echo off
  2. dir /b /a-d /od *.jpg *.bmp *.png *.gif | cscript -nologo -E:JScript %0
  3. pause
  4. exit
  5. */
  6. var img=new ActiveXObject("WIA.ImageFile");
  7. while(!WScript.StdIn.AtEndOfStream) {
  8.     var file = WScript.StdIn.ReadLine();
  9.     img.LoadFile(file);
  10.     WSH.Echo(file, img.Height+'x'+img.Width+'x'+img.HorizontalResolution);
  11. }
复制代码

作者: 灯塔彭于晏    时间: 2020-12-31 08:33

如果确定是按创建时间排序,这样应该可以
Test.js修改顶楼的:
WHY 发表于 2020-12-29 19:04



    谢谢~谢谢~ 这个效率真的高,顶楼的代码会有几秒的处理时间,不如你的代码。

想额外咨询个小问题,您的JS代码能否这样改:
根据文本B.TXT里的内容,内容如下:
c:\1.jpg
c:\2.jpg
……
是完整的电脑中图片的路径。

根据这个路径,分别去提取宽高呢,从而完美一对一对应呢。

因为我发现,按照时间排序,最快也就是按照“秒”来算,但一秒内存了2个图,也是可以的,现在的浏览器插件太迅速了。所以还是有几率导致和桌面顺序不一样。

降低保存速度也是可以的,就是好奇,能否改成 像上面说的那样一对一。 谢谢您了。
作者: WHY    时间: 2020-12-31 15:05

回复 21# 灯塔彭于晏


    Test.js
  1. var listFile = 'B.txt';   //列表文件
  2. var Img = new ActiveXObject('WIA.ImageFile');
  3. var fso = new ActiveXObject('Scripting.FileSystemObject');
  4. var objFile = fso.OpenTextFile(listFile, 1);
  5. var arr = [];
  6. while( !objFile.AtEndOfStream ){
  7.     var file = objFile.ReadLine().replace(/^\s+|\s+$/g, '');
  8.     if(file == '') continue;
  9.     try {
  10.         Img.LoadFile(file);
  11.         arr.push(file + ' ' + Img.Width + 'x' + Img.Height + 'x' + Img.HorizontalResolution);
  12.     } catch(e) {
  13.         WSH.Echo(file + ' ' + e.message);
  14.     }
  15. }
  16. fso.OpenTextFile('图片信息.txt', 2, true).WriteLine( arr.join('\r\n') );
  17. WSH.Echo('Done');
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2