标题: [文件操作] [已解决]批处理调用ExifTool批量读取、输出、修改图片IPTC参数的功能 [打印本页]
作者: 52hz 时间: 2023-5-6 10:21 标题: [已解决]批处理调用ExifTool批量读取、输出、修改图片IPTC参数的功能
需要对一批jpg格式的图片,根据其【右键】-【属性】-【详细信息】中的【标记】里的内容进行读取,然后输出到文本,每个图片输出一行,每个参数用分号隔开,也要有批量修改图片此参数的功能。
图例如下
我在【第三方命令行】板块的帖子中
http://www.bathome.net/viewthrea ... amp;highlight=jhead
用jhead工具查到这些参数是在【IPTC data】下的【Keywords】显示,参照5楼大佬的代码,可以成功读取到了图片的这个参数,但是没找到修改这个参数的命令。
我提问GPT机器人,给我了两串代码,但是我跑不起来。因为不了解相关的第三方工具,也没有找到详尽的中文教程,所以不知道是哪里的问题,求大佬们指教。多谢!!
第一段
提问:如何使用bat 脚本实现批量修改JPG图片的IPTC参数
回答:要实现批量修改JPG图片的IPTC参数,可以使用exiftool.exe来完成。exiftool.exe是一个命令行工具,可以读取和修改图像的元数据。下面是一个示例脚本,可以批量修改指定文件夹下的所有JPG图片的IPTC参数:- @echo off
-
- setlocal enabledelayedexpansion
-
-
- set "exiftool_path=C:\path\to\exiftool.exe"
-
- set "image_folder=C:\path\to\image\folder"
-
-
- for %%f in (%image_folder%\*.jpg) do (
-
- set "file_path=%%~dpf%%~nf"
-
-
- %exiftool_path% ^
-
- -overwrite_original ^
-
- -IPTC:ObjectName="New Object Name" ^
-
- -IPTC:Caption-Abstract="New Caption" ^
-
- -IPTC:Keywords="Keyword1;Keyword2" ^
-
- "!file_path!.jpg"
-
- )
复制代码
在上面的脚本中,将exiftool.exe的路径设置为变量“exiftool_path”,将图像文件夹路径设置为变量“image_folder”。使用“for”循环遍历指定文件夹下的所有JPG图片,对于每个图片文件,使用exiftool.exe修改其IPTC参数(这里只修改了ObjectName、Caption-Abstract和Keywords),然后将原始文件覆盖保存。
需要注意的是,exiftool.exe的参数名是区分大小写的,不要将参数名写错。另外,这里使用了“setlocal enabledelayedexpansion”来启用延迟扩展变量,否则在循环中使用“!file_path!”时会出现问题。(1/10)
第二段:
提问: 如何使用bat脚本实现批量读取图片的IPTC参数并输出到文本,然后通过文本批量修改图片的IPTC参数
回答:这是一个基本的bat脚本的框架,用于读取图片的IPTC参数并将其输出到文本。前提是需要安装ExifTool并在系统环境变量中设置其路径。- @echo off
- setlocal EnableDelayedExpansion
-
-
-
- set "folder=C:\path\to\folder\with\images"
-
- set "outfile=C:\path\to\output\file.txt"
-
-
- echo "File, Creator, Title, Description" > %outfile%
-
-
-
- for %%f in (%folder%\*.jpg) do (
-
- set "filename=%%~nxf"
-
- set "creator="
-
- set "title="
-
- set "description="
-
-
- for /f "tokens=1,2 delims=:" %%a in ('exiftool -s3 -iptc:Creator -iptc:ObjectName -iptc:Caption-Abstract "%%~f"') do (
-
- if "%%a"=="Creator" set "creator=%%b"
-
- if "%%a"=="ObjectName" set "title=%%b"
-
- if "%%a"=="Caption-Abstract" set "description=%%b"
-
- )
-
-
- echo "!filename!,!creator!,!title!,!description!" >> %outfile%
-
- )
- echo "Done."
-
- pause
复制代码
这个脚本会将指定文件夹中的所有`.jpg`文件的IPTC参数读取到一个文本文件中。你可以使用文本编辑器或Excel等工具将其打开和编辑。在这个基础之上,你可以编写另一个bat脚本,以读取此文件并使用ExifTool将修改后的IPTC参数应用于相应的图片。(1/10)
作者: 52hz 时间: 2023-5-6 10:24
图片没附成功,我把两个示例图链接放这里,辛苦大佬们看一下
https://gd-hbimg.huaban.com/7fbf335f50d9916a0c982ccef6766b27452d74264788-MjW35x_fw1200webp
https://gd-hbimg.huaban.com/3669afb81fae4c6e5070902061730972fcb57fe867d3-Hfq7YD_fw1200webp
作者: czjt1234 时间: 2023-5-6 10:58
- rem 另存为 ANSI 编码
- ' & cls & cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit
-
- Dim oWshShell, oFSO, s, oShell
-
- Const file = "1.jpg" '原文件。支持文件拖放,支持文件名作为命令行参数
-
- Set oShell = CreateObject("Shell.Application")
- Set oWshShell = CreateObject("WScript.Shell")
- Set oFSO = CreateObject("Scripting.FileSystemObject")
- s = oFSO.GetParentFolderName(WScript.ScriptFullname)
- oWshShell.CurrentDirectory = s
-
- If WScript.Arguments.Count > 0 Then
- For Each s In WScript.Arguments
- Call run(s)
- Next
- Else
- Call run(file)
- End If
-
- Sub run(ByVal file)
- Dim s, oFolder, oFolderItem, i
- s = oFSO.GetAbsolutePathName(file)
- WScript.Echo s
- Set oFolder = oShell.NameSpace(oFSO.GetParentFolderName(s))
- Set oFolderItem = oFolder.ParseName(oFSO.GetFileName(s))
- For i = 0 To 500
- If oFolder.GetDetailsOf(Null, i) = "标记" Then s = i
- Next
- s = oFolder.GetDetailsOf(oFolderItem, s)
- If InStr(s, ";") Then
- For Each i In Split(s, ";")
- WScript.Echo "标记" & vbTab & Trim(i)
- Next
- Else
- WScript.Echo "标记" & vbTab & s
- End If
- End Sub
复制代码
读取标记
作者: 52hz 时间: 2023-5-6 11:11
回复 3# czjt1234
请教大佬,这个是vbs代码么,看着不太像bat,保存文本后缀需要改成vbs么还是其它后缀,请原谅我太菜
作者: czjt1234 时间: 2023-5-6 11:29
保存为bat
没看清题目,只能读取不能修改
作者: 52hz 时间: 2023-5-6 11:54
回复 5# czjt1234
大佬,我运行了不显示标记的具体内容(截图如链接),如果能正常显示,那输出到文档应该不成问题。另外,修改这个参数的功能可以实现么?
https://gd-hbimg.huaban.com/e0c5ae379accee1cb51c11a332c299eccdeabc522800-ltFmVV_fw1200webp
作者: czjt1234 时间: 2023-5-6 12:59
回复 6# 52hz
我在win7x64测试正确的
你是啥系统?
作者: 52hz 时间: 2023-5-6 13:52
回复 7# czjt1234
win 7 专业版,64位
作者: 77七 时间: 2023-5-6 16:13
本帖最后由 77七 于 2023-9-22 17:20 编辑
读取- @echo off
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
- for /f "tokens=1* delims=:" %%a in ('exiftool "%%i" ^|find "Keywords"') do (
- set "str=%%b"
- set "str=!str:,=;!"
- set "str=!str: =!"
- echo %%~fi !str!
- )
- ))>1.txt
- endlocal
- pause
复制代码
修改
- @echo off
- rem 如 str=参数1, 参数2
- set /p str=输入参数:
- for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
- exiftool -overwrite_original -iptc:Keywords="%str%" "%%i"
- )
- pause
复制代码
作者: 52hz 时间: 2023-5-6 16:35
回复 9# 77七
测试了一下读取和写入都很好用,太感谢了,多谢大佬,谢谢!!
作者: Batcher 时间: 2023-5-6 21:25
回复 2# 52hz
如果需要上传文件,可以用阿里云盘或百度网盘。
如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: 52hz 时间: 2023-5-8 09:58
回复 11# Batcher
好的,多谢大佬
作者: 52hz 时间: 2023-5-18 08:24
本帖最后由 52hz 于 2023-5-18 08:26 编辑
回复 9# 77七
大佬,在使用过程中发现一个问题,当输入参数过长的时候会提示:
Waring:【Minor】IPTC:Keywords exceeds length limit <truncated> - 图片名称.jpg
运行窗口截图:https://imgse.com/i/p9Wvq61
我翻译了一下,说是超过长度限制,被截断。修改后的图片标记只截取了输入参数的前60个字符。
请问这个有解决办法么,或者有没有其它不限制长度的命令行工具可以代替?
作者: buyiyang 时间: 2023-5-18 11:08
- chcp 65001
- rem 查看
- exiftool -s -m -FileName -iptc:keywords -T *.jpg
- rem 修改
- exiftool -m -overwrite_original -iptc:keywords="values1,value2" *.jpg
- rem exif与iptc属性都是unicode,请将脚本保存为utf-8编码
复制代码
作者: 77七 时间: 2023-5-18 11:10
回复 13# 52hz
chatgpt答案,这个可以设置超60个字符,替换一下修改那一行就行
- Exiv2是一款开源的图像元数据编辑器,可以修改图片的IPTC信息,包括Keywords关键词。下面是修改图片IPTC:Keywords参数的示例:
-
- 假设我们要修改一张名为"example.jpg"的图片的Keywords参数为"landscape, nature, mountain",则需要使用以下命令:
-
- exiv2 -M "set Iptc.Application2.Keywords landscape nature mountain" example.jpg
- 其中,-M指定对元数据进行操作,"set Iptc.Application2.Keywords"表示设置IPTC的Keywords参数,后面跟着要设置的关键词,多个关键词之间用空格隔开。最后是要修改的图片文件名。
-
- 执行以上命令后,应该会看到如下输出:
-
- setting Iptc.Application2.Keywords to landscape, nature, mountain
- 这说明Keywords参数已经成功被修改了。
复制代码
作者: 52hz 时间: 2023-5-18 11:40
好的,多谢各位大佬帮忙,已经成功解决,再次拜谢,谢谢!!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |