标题: [文件操作] 【已解决】利用bat 和nconvert 能否判定一张图片的分辨率奇偶自动裁剪 [打印本页]
作者: tcasdsss 时间: 2014-9-12 13:19 标题: 【已解决】利用bat 和nconvert 能否判定一张图片的分辨率奇偶自动裁剪
本帖最后由 tcasdsss 于 2014-9-12 17:45 编辑
就是要把所有奇数分辨率的裁成偶数
比如 899*1299就转化为 898*1298这样
如果本身就是898*1298就不要再变了
作者: tcasdsss 时间: 2014-9-12 13:57
我先在能想到的办法就是
先ffmpeg转换一下
然后高-1 删除那些转好的图片和转坏了的mkv
再来一次ffmpeg
然后宽-1 删除那些转好的图片和转坏了的mkv
再来一次 删除那些转好的图片和转坏了的mkv
最后高-1 再来一次ffmpeg
相当的复杂……
作者: CrLf 时间: 2014-9-12 15:25
本帖最后由 CrLf 于 2014-9-12 16:10 编辑
这需要频繁调用外部命令,改用 vbs 处理可能会快些,提供一个函数示例:- Const testImage = "F:\test\测试\test.jpg"
-
- If cropImage(testImage,"png") Then
- MsgBox testImage & " 符合条件"
- Else
- MsgBox testImage & " 已被跳过"
- End If
-
- Function cropImage(imageFile,fileType)
- Dim Img,IP,fso
- Dim cropWidth,cropHeight,outFile,FormatID
-
- saveFile =imageFile
-
- Set Img = CreateObject("WIA.ImageFile")
- Set IP = CreateObject("WIA.ImageProcess")
- Set fso = WScript.CreateObject("Scripting.Filesystemobject")
-
- Img.LoadFile imageFile
-
- cropWidth = Img.Width And 1
- cropHeight = Img.Height And 1
-
- If cropWidth Or cropHeight Then
- cropImage = 1
-
- IP.Filters.Add IP.FilterInfos("Crop").FilterID
- IP.Filters(1).Properties("Right") = cropWidth
- IP.Filters(1).Properties("Bottom") = cropHeight
-
- Select Case LCase(fileType)
- Case "bmp": FormatID = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
- Case "png": FormatID = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
- Case "gif": FormatID = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
- Case "jpeg","jpg": FormatID = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
- Case "tiff","tif": FormatID = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
- End Select
-
- If Len(FormatID)>0 Then
- IP.Filters.Add IP.FilterInfos("Convert").FilterID
- IP.Filters(2).Properties("FormatID").Value = FormatID
- outFile = Replace(imageFile&"*" , fso.GetExtensionName(imageFile)&"*" , fileType)
- End If
-
- Set Img = IP.Apply(Img)
- If imageFile = outFile Then fso.DeleteFile imageFile
- Img.SaveFile outFile
- End If
- End Function
复制代码
作者: tcasdsss 时间: 2014-9-12 15:31
本帖最后由 tcasdsss 于 2014-9-12 16:04 编辑
回复 3# CrLf
怎么才能设定输出的图像为png格式呢 如果用jpg输出2次损失很大
好的 感谢
作者: tcasdsss 时间: 2014-9-12 15:52
回复 3# CrLf
如果用bat调用这个vbs 怎么才能把变量弄过去呢?
作者: CrLf 时间: 2014-9-12 16:06
已修改
用 WScript.Arguments 来读取命令行参数,不过这样一来就违背尽量少调用外部命令的初衷了,建议把要处理的文件列出清单,保存在文本或用管道传递给 vbs,或者完全用 vbs 来实现
作者: tcasdsss 时间: 2014-9-12 16:11
回复 6# CrLf - @Echo Off
- dir *.jpg *.png /a /b /s >> list.txt
复制代码
这个导出的list怎么引入vbs?
作者: DAIC 时间: 2014-9-12 16:25
- @echo off
- set "filename=1.jpg"
- for /f "tokens=1,3" %%i in ('nconvert.exe -info "%filename%" ^| findstr "Width Height"') do (
- set "%%i=%%j"
- )
- set /a modW=Width%%2
- set /a modH=Height%%2
-
- set "change=0"
- if %modW% neq 0 (
- set /a newW=Width-1
- set "change=1"
- ) else (
- set newW=%Width%
- )
- if %modH% neq 0 (
- set /a newH=Height-1
- set "change=1"
- ) else (
- set newH=%Height%
- )
-
- if %change% equ 1 (
- nconvert -overwrite -resize %newW% %newH% "%filename%"
- )
复制代码
作者: tcasdsss 时间: 2014-9-12 16:36
回复 8# DAIC
这个resize没有楼上的crop好 resize会有更大的损失
作者: tcasdsss 时间: 2014-9-12 16:41
本帖最后由 tcasdsss 于 2014-9-12 16:47 编辑
回复 8# DAIC - @echo off
- set "filename=1.jpg"
- for /f "tokens=1,3" %%i in ('nconvert.exe -info "%filename%" ^| findstr "Width Height"') do (
- set "%%i=%%j"
- )
- set /a modW=Width%%2
- set /a modH=Height%%2
-
- set "change=0"
- if %modW% neq 0 (
- set /a newW=Width-1
- set "change=1"
- ) else (
- set newW=%Width%
- )
- if %modH% neq 0 (
- set /a newH=Height-1
- set "change=1"
- ) else (
- set newH=%Height%
- )
-
- if %change% equ 1 (
- nconvert -overwrite -crop 0 0 %newW% %newH% "%filename%"
- )
复制代码
这个样子可以实现jpg无损crop 可是png怎么办?
去了jpeg就行了…… 都是无损变换了
作者: tcasdsss 时间: 2014-9-12 17:14
回复 8# DAIC
那该怎么样批量处理呢?- dir *.jpg *.png /a /b /s >> list.txt
- for /f "delims=" %%a in (list.txt) do (
复制代码
这样没用
作者: tcasdsss 时间: 2014-9-12 17:31
解决了…… 用了个特2*的办法- @Echo Off
- dir *.jpg *.png /a /b /s >> list.txt
复制代码
先来个列表- @Echo Off
- for /f "delims=" %%b in (list.txt) do (
- set a=%%b
- more /e +1 list.txt > list.tmp
- del list.txt
- ren list.tmp list.txt
- call 分辨率.bat
- )
复制代码
来个变量call过去 第一行删了- @Echo Off
- set "filename=%a%"
- for /f "tokens=1,3" %%i in ('nconvert.exe -info "%filename%" ^| findstr "Width Height"') do (
- set "%%i=%%j"
- )
- set /a modW=Width%%2
- set /a modH=Height%%2
-
- set "change=0"
- if %modW% neq 0 (
- set /a newW=Width-1
- set "change=1"
- ) else (
- set newW=%Width%
- )
- if %modH% neq 0 (
- set /a newH=Height-1
- set "change=1"
- ) else (
- set newH=%Height%
- )
-
- if %change% equ 1 (
- nconvert -overwrite -crop 0 0 %newW% %newH% "%filename%"
-
- )
- call 2.bat
- pause
复制代码
改完了再call回来……
作者: DAIC 时间: 2014-9-12 17:36
回复 12# tcasdsss - @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b /s /a-d *.jpg *.png') do (
- for /f "tokens=1,3" %%i in ('nconvert.exe -info "%%a" ^| findstr "Width Height"') do (
- set "%%i=%%j"
- )
- set /a modW=Width%%2
- set /a modH=Height%%2
- set "change=0"
- if !modW! neq 0 (
- set /a newW=Width-1
- set "change=1"
- ) else (
- set newW=!Width!
- )
- if !modH! neq 0 (
- set /a newH=Height-1
- set "change=1"
- ) else (
- set newH=!Height!
- )
- if !change! equ 1 (
- nconvert -overwrite -crop 0 0 !newW! !newH! "%%a"
- )
- )
复制代码
作者: tcasdsss 时间: 2014-9-12 17:41
回复 13# DAIC
很好很强大
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |