[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理据图片尺寸大小计算幅面/纸张大小并统计相应数量

下面的代码可以获取文件夹下图片的大小,但是不是很直观,想进一步得出每张图片的规格。
代码得出的尺寸算式不规则,首先判断算式中的那个数字大,再根据规则比对,规则如下:
大于129等于A0+
大于118.9小于129等于A0
大于84.1小于118.9等于A1
大于59.4小于84.1等于A2
大于42小于59.4等于A3
大于29.7小于42等于A4
小于29.7也等于A4

在图片尺寸.txt的最下面再统计出:
共有A0+多少张;共有A0多少张;共有A1多少张;共有A2多少张;共有A3多少张;共有A4多少张;
折合A4共有多少张。
折合规则为:
A0+=32张
A0=16张
A1=8张
A2=4张
A3=2张
A4=1张

希望得到这样的结果
J2-11-00001.JPG 123.6x100.0  A0
J2-11-000010.JPG 63.2x100.0  A1
共有A0+=0张;共有A0=1张;共有A1=1张;共有A2=0张;共有A3=0张;共有A4=0张;
折合A4共有24张。
  1. @set @n=0//& cd /d "F:\测试\"& dir /a-d/s/b *.tif *.jpg *.png *.图片格式| cscript -nologo -e:jscript "%~f0" >图片尺寸.txt& pause& start notepad a.txt& exit /b
  2. var fso = new ActiveXObject('Scripting.FileSystemObject');
  3. var img = new ActiveXObject('WIA.ImageFile');
  4. while(!WSH.StdIn.AtEndOfStream){
  5.     var f = fso.GetFile(WSH.StdIn.ReadLine());
  6.     img.LoadFile(f);
  7.     WSH.Echo(fso.GetFileName(f)+' '+
  8.         (img.Width/img.HorizontalResolution*2.54).toFixed(1)+'x'+
  9.             (img.Height/img.VerticalResolution*2.54).toFixed(1));
  10. }
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
非常好的论坛

可以改进生成文本或 Excel 进行数据汇总吗?
如果生成 Excel 最好
生成效果如下
类型                                           信息                        数量
A4图像        E:\AAAAA\BBBB\CCC\DDDD\001.jpg         1
......
A4图像        E:\AAAAA\BBBB\CCC\DDDD\100.jpg         1
小计                            A4图像                             80
小计                            A3图像                             10
小计                            A2图像                             5
小计                            A1图像                             1
小计                            A0图像                             4

TOP

回复 9# hefengnian


    Win10自带的记事本保存的编码格式默认为 utf8 without bom
脚本必须另存为 ansi 编码。

TOP

为什么bat运行时提示Microsoft JScript 编译错误: 缺少 ';'

TOP

回复 7# CrLf


    感谢提醒,不过我是这样理解的:WIA.ImageFile 和 Shell.Application 获取到的水平(垂直)分辨率都是实际的 DPI 值。

TOP

回复 3# WHY


    不根据实际 DPI 换算成厘米吗?要是像素密度不同呢?

TOP

回复 5# WHY
XP下还是不能用,这个就不纠结了。WIN10可以用就ok。非常感谢!
非常好的论坛

TOP

回复 4# 001011


    已修改,WinXP系统请自行修改测试

TOP

本帖最后由 001011 于 2017-3-15 20:14 编辑

回复 3# WHY
非常感谢,再麻烦您一下。最后那个折合能再加进去啊。
还有XP系统下  只有‘宽度’和‘高度’   没有分辨率
非常好的论坛

TOP

本帖最后由 WHY 于 2017-3-15 20:44 编辑

以下代码在win10、Win7中测试通过,其它系统中的“宽度”、“高度”、“水平分辨率”、“垂直分辨率”显示有可能不同(比如“水平分辨率”可能是“水平尺寸”等),具体可以右击图片“属性——详细信息”查看,改成相应文字就可以了
  1. @set @n=0/* & echo off
  2. cd /d E:\test\
  3. dir /a-d /b /s *.tif *.jpg *.png *.jpeg | cscript -nologo -e:jscript "%~f0"
  4. pause & exit /b */
  5. var arr = [0, 0, 0, 0, 0, 0];
  6. var ssh = new ActiveXObject('Shell.Application');
  7. var fd  = ssh.NameSpace(0x00);
  8. var checkSize = function(width, height){
  9.         if(width>=129 || height>=129){
  10.                 arr[0] += 1;
  11.                 return 'A0+'
  12.         }else if((width>=118.9 && width<129) || (height>=118.9 && height<129)){
  13.                 arr[1] += 1;
  14.                 return 'A0'
  15.         }else if((width>=84.1 && width<118.9) || (height>=84.1 && height<118.9)){
  16.                 arr[2] += 1;
  17.                 return 'A1'
  18.         }else if((width>=59.4 && width<84.1) || (height>=59.4 && height<84.1)){
  19.                 arr[3] += 1;
  20.                 return 'A2'
  21.         }else if((width>=42 && width<59.4) || (height>=42 && height<59.4)){
  22.                 arr[4] += 1;
  23.                 return 'A3'
  24.         }else {
  25.                 arr[5] += 1;
  26.                 return 'A4'
  27.         }
  28. }
  29. for(var i=0; i<300; i++) {   
  30.         if(fd.GetDetailsOf(null, i) == '宽度') {
  31.                 var n1 = i;
  32.         }else if(fd.GetDetailsOf(null, i) == '高度') {
  33.                 var n2 = i;
  34.         }else if(/^水平分[辨辩]率$/.test(fd.GetDetailsOf(null, i))) {
  35.                 var n3 = i;
  36.         }else if(/^垂直分[辨辩]率$/.test(fd.GetDetailsOf(null, i))) {
  37.                 var n4 = i;
  38.         }
  39. }
  40. while(!WSH.StdIn.AtEndOfStream){
  41.         var file = WSH.StdIn.ReadLine();
  42.         var name = file.replace(/.+\\(.+)$/, '$1');
  43.         var fd = ssh.NameSpace( file.replace(/(.+)\\.+$/, '$1') );
  44.         var w = fd.GetDetailsOf(fd.ParseName(name), n1).match(/\d+/)[0];  //宽度
  45.         var h = fd.GetDetailsOf(fd.ParseName(name), n2).match(/\d+/)[0];  //高度
  46.         var hr = fd.GetDetailsOf(fd.ParseName(name), n3).match(/\d+/)[0]; //水平刷新率
  47.         var vr = fd.GetDetailsOf(fd.ParseName(name), n4).match(/\d+/)[0]; //垂直刷新率
  48.         var width = (w / hr * 2.54).toFixed(1); height = (h / vr * 2.54).toFixed(1);
  49.         var size = checkSize(width, height);
  50.         WSH.Echo(name + ' ' + width + 'x' + height + ' ' + size);
  51. }
  52. var s = 'A0+共' + arr[0] + '张,A0共' + arr[1] + '张,A1共' + arr[2] + '张,';
  53. s += 'A2共' + arr[3] + '张,A3共' + arr[4] + '张,A4共' + arr[5] + '张\r\n';
  54. s += '折合A4共' + (arr[0]*32+arr[1]*16+arr[2]*8+arr[3]*4+arr[4]*2+arr[5]) + '张'
  55. WSH.Echo(s)
复制代码
1

评分人数

TOP

Microsoft JScript 运行时错误: Automation

本帖最后由 pcl_test 于 2017-3-15 20:11 编辑

上面的这个代码 在win10 可以运行  为什么在XP下不能运行呢
报:Microsoft JScript 运行时错误: Automation 服务器不能创建对象
非常好的论坛

TOP

返回列表