标题: [文本处理] [已解决]批处理获取图片分辨率的问题 [打印本页]
作者: 灯塔彭于晏 时间: 2020-12-28 14:54 标题: [已解决]批处理获取图片分辨率的问题
在百度中寻求到的#获取图片分辨率信息#的批处理,不用额外其他软件,还挺好的。
但输出结果中,图片会按照名字,重新自动排列顺序,请问这一点该怎么改呢?
要求:我不想它重新排列,请保持桌面顺序,依次输出
谢谢您啦~- @echo off & title
- setlocal enabledelayedexpansion
-
- set Pic=*.jp*g,*.png,*.bmp,*.gif
-
- call :CreatVBS
- (for %%a in (%Pic%) do (
- for /f "tokens=1-3 delims=x" %%b in ('cscript -nologo "%tmp%\GetImgInfo.vbs" "%%~sa"') do (
- echo %%~nxa %%~bx%%~c
- )
- ))>图片信息.txt
- pause
- exit
-
- :CreatVBS
- (echo '获取图片文件的宽、高、DPI
- echo On Error Resume Next
- echo Dim Img
- echo Set Img = CreateObject^("WIA.ImageFile"^)
- echo Img.LoadFile WScript.Arguments^(0^)
- echo Wscript.Echo Img.Width ^& "x" ^& Img.Height ^& "x" ^& Img.HorizontalResolution)>"%tmp%\GetImgInfo.vbs"
- 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行改成:- (for /f "delims=" %%a in ('dir /b /on *.jpg,*.bmp,*.png,*.gif') do (
复制代码
试试行不行。
作者: WHY 时间: 2020-12-28 16:07
保存为 Test.js, 双击运行- var Img = new ActiveXObject('WIA.ImageFile');
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var arr = [];
- var e = new Enumerator( fso.GetFolder('.').Files );
- for(;!e.atEnd();e.moveNext()){
- var file = e.item().Name;
- if( !/\.(?:jpg|bmp|png|gif)$/i.test(file) ) continue;
- Img.LoadFile(file);
- arr.push(file + ' ' + Img.Width + 'x' + Img.Height + 'x' + Img.HorizontalResolution);
- }
- fso.OpenTextFile('图片信息.txt', 2, true).WriteLine( arr.join('\r\n') );
- WSH.Echo('Done');
复制代码
作者: 灯塔彭于晏 时间: 2020-12-29 07:58
回复 2# Batcher
抱歉,我没描述清楚。 我是想按照桌面的图片的顺序来输出结果,但代码的结果是重新排序了。 可以看截图,明显顺序和桌面是不一样的。
希望可以和桌面一样。
作者: ivor 时间: 2020-12-29 08:32
用powershell 更方便- 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# 灯塔彭于晏
可以按创建时间排序- 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- var Img = new ActiveXObject('WIA.ImageFile');
- var fso = new ActiveXObject('Scripting.FileSystemObject');
-
- Date.prototype.format = function(){
- var yy = this.getFullYear();
- var MM = ( '' + (101 + this.getMonth())).substr(1);
- var dd = ( '' + (100 + this.getDate())).substr(1);
- var hh = ( '' + (100 + this.getHours())).substr(1);
- var mm = ( '' + (100 + this.getMinutes())).substr(1);
- var ss = ( '' + (100 + this.getSeconds())).substr(1);
- return yy + MM + dd + hh + mm + ss;
- }
-
- var arr = [];
- var e = new Enumerator( fso.GetFolder('.').Files );
-
- for(;!e.atEnd();e.moveNext()){
- var file = e.item().Name;
- if( !/\.(?:jpg|bmp|png|gif)$/i.test(file) ) continue;
- Img.LoadFile(file);
- var dt = new Date(e.item().DateCreated).format();
- arr.push( dt + ' ' + file + ' ' + Img.Width + "x" + Img.Height + "x" + Img.HorizontalResolution );
- }
-
- arr.sort(); //正序
- //arr.sort().reverse(); //逆序
- fso.OpenTextFile('图片信息.txt', 2, true).WriteLine( arr.join('\r\n').replace(/^\d+ /gm, '') );
-
- WSH.Echo('Done');
复制代码
修改顶楼的:- @echo off
- set Pic=*.jpg,*.jpeg,*.png,*.bmp,*.gif
-
- call :CreatVBS
- dir /b /od /tc %Pic% | cscript //nologo "%tmp%\GetImgInfo.vbs" > PicInfo.txt
- pause & exit
-
- :CreatVBS
- (
- echo '获取图片文件的宽、高、DPI
- echo On Error Resume Next
- echo Dim Img, file
- echo Set Img = CreateObject("WIA.ImageFile"^)
- echo while Not WSH.StdIn.AtEndOfStream
- echo file = WSH.StdIn.ReadLine
- echo Img.LoadFile file
- echo WSH.Echo file ^& " " ^& Img.Width ^& "x" ^& Img.Height ^& "x" ^& Img.HorizontalResolution
- echo wend
- )>"%tmp%\GetImgInfo.vbs"
复制代码
作者: ivor 时间: 2020-12-29 20:24
我只写一部分代码
第一种用重定向最后面 >1.txt
第二种powershell输出到文本.size -join ' ' | out-file 1.txt
作者: terse 时间: 2020-12-29 20:46
- @set @i=0 /* & @echo off
- dir /b /a-d /od *.jpg *.bmp *.png *.gif | cscript -nologo -E:JScript %0
- pause
- exit
- */
- var img=new ActiveXObject("WIA.ImageFile");
- while(!WScript.StdIn.AtEndOfStream) {
- var file = WScript.StdIn.ReadLine();
- img.LoadFile(file);
- WSH.Echo(file, img.Height+'x'+img.Width+'x'+img.HorizontalResolution);
- }
复制代码
作者: 灯塔彭于晏 时间: 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- var listFile = 'B.txt'; //列表文件
- var Img = new ActiveXObject('WIA.ImageFile');
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var objFile = fso.OpenTextFile(listFile, 1);
- var arr = [];
- while( !objFile.AtEndOfStream ){
- var file = objFile.ReadLine().replace(/^\s+|\s+$/g, '');
- if(file == '') continue;
- try {
- Img.LoadFile(file);
- arr.push(file + ' ' + Img.Width + 'x' + Img.Height + 'x' + Img.HorizontalResolution);
- } catch(e) {
- WSH.Echo(file + ' ' + e.message);
- }
- }
- fso.OpenTextFile('图片信息.txt', 2, true).WriteLine( arr.join('\r\n') );
- WSH.Echo('Done');
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |