找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 57017|回复: 15

[文件操作] [已解决]批处理调用ExifTool批量读取、输出、修改图片IPTC参数的功能

[复制链接]
发表于 2023-5-6 10:21:34 | 显示全部楼层 |阅读模式
需要对一批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参数:


  1. @echo off

  2. setlocal enabledelayedexpansion


  3. set "exiftool_path=C:\path\to\exiftool.exe"

  4. set "image_folder=C:\path\to\image\folder"


  5. for %%f in (%image_folder%\*.jpg) do (

  6.   set "file_path=%%~dpf%%~nf"


  7.   %exiftool_path% ^

  8.     -overwrite_original ^

  9.     -IPTC:ObjectName="New Object Name" ^

  10.     -IPTC:Caption-Abstract="New Caption" ^

  11.     -IPTC:Keywords="Keyword1;Keyword2" ^

  12.     "!file_path!.jpg"

  13. )
复制代码
在上面的脚本中,将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并在系统环境变量中设置其路径。
  1. @echo off
  2. setlocal EnableDelayedExpansion



  3. set "folder=C:\path\to\folder\with\images"

  4. set "outfile=C:\path\to\output\file.txt"


  5. echo "File, Creator, Title, Description" > %outfile%



  6. for %%f in (%folder%\*.jpg) do (

  7.     set "filename=%%~nxf"

  8.     set "creator="

  9.     set "title="

  10.     set "description="


  11.     for /f "tokens=1,2 delims=:" %%a in ('exiftool -s3 -iptc:Creator -iptc:ObjectName -iptc:Caption-Abstract "%%~f"') do (

  12.         if "%%a"=="Creator" set "creator=%%b"

  13.         if "%%a"=="ObjectName" set "title=%%b"

  14.         if "%%a"=="Caption-Abstract" set "description=%%b"

  15.     )


  16.     echo "!filename!,!creator!,!title!,!description!" >> %outfile%

  17. )
  18. echo "Done."

  19. pause

复制代码
这个脚本会将指定文件夹中的所有`.jpg`文件的IPTC参数读取到一个文本文件中。你可以使用文本编辑器或Excel等工具将其打开和编辑。在这个基础之上,你可以编写另一个bat脚本,以读取此文件并使用ExifTool将修改后的IPTC参数应用于相应的图片。(1/10)
 楼主| 发表于 2023-5-6 10:24:58 | 显示全部楼层
图片没附成功,我把两个示例图链接放这里,辛苦大佬们看一下
https://gd-hbimg.huaban.com/7fbf335f50d9916a0c982ccef6766b27452d74264788-MjW35x_fw1200webp
https://gd-hbimg.huaban.com/3669afb81fae4c6e5070902061730972fcb57fe867d3-Hfq7YD_fw1200webp
发表于 2023-5-6 10:58:33 | 显示全部楼层
  1. rem 另存为 ANSI 编码
  2. ' & cls & cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit

  3. Dim oWshShell, oFSO, s, oShell

  4. Const file = "1.jpg"    '原文件。支持文件拖放,支持文件名作为命令行参数

  5. Set oShell = CreateObject("Shell.Application")
  6. Set oWshShell = CreateObject("WScript.Shell")
  7. Set oFSO = CreateObject("Scripting.FileSystemObject")
  8. s = oFSO.GetParentFolderName(WScript.ScriptFullname)
  9. oWshShell.CurrentDirectory = s

  10. If WScript.Arguments.Count > 0 Then
  11.     For Each s In WScript.Arguments
  12.         Call run(s)
  13.     Next
  14. Else
  15.     Call run(file)
  16. End If

  17. Sub run(ByVal file)
  18.     Dim s, oFolder, oFolderItem, i
  19.     s = oFSO.GetAbsolutePathName(file)
  20.     WScript.Echo s
  21.     Set oFolder = oShell.NameSpace(oFSO.GetParentFolderName(s))
  22.     Set oFolderItem = oFolder.ParseName(oFSO.GetFileName(s))
  23.     For i = 0 To 500
  24.         If oFolder.GetDetailsOf(Null, i) = "标记" Then s = i
  25.     Next
  26.     s = oFolder.GetDetailsOf(oFolderItem, s)
  27.     If InStr(s, ";") Then
  28.         For Each i In Split(s, ";")
  29.             WScript.Echo "标记" & vbTab & Trim(i)
  30.         Next
  31.     Else
  32.         WScript.Echo "标记" & vbTab & s
  33.     End If
  34. End Sub
复制代码
读取标记
 楼主| 发表于 2023-5-6 11:11:42 | 显示全部楼层
回复 3# czjt1234


    请教大佬,这个是vbs代码么,看着不太像bat,保存文本后缀需要改成vbs么还是其它后缀,请原谅我太菜
发表于 2023-5-6 11:29:52 | 显示全部楼层
保存为bat

没看清题目,只能读取不能修改
 楼主| 发表于 2023-5-6 11:54:43 | 显示全部楼层
回复 5# czjt1234


    大佬,我运行了不显示标记的具体内容(截图如链接),如果能正常显示,那输出到文档应该不成问题。另外,修改这个参数的功能可以实现么?
https://gd-hbimg.huaban.com/e0c5ae379accee1cb51c11a332c299eccdeabc522800-ltFmVV_fw1200webp
发表于 2023-5-6 12:59:29 | 显示全部楼层
回复 6# 52hz


    我在win7x64测试正确的

你是啥系统?
 楼主| 发表于 2023-5-6 13:52:33 | 显示全部楼层
回复 7# czjt1234


    win 7 专业版,64位
发表于 2023-5-6 16:13:59 | 显示全部楼层
本帖最后由 77七 于 2023-9-22 17:20 编辑

读取
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  4.         for /f "tokens=1* delims=:" %%a in ('exiftool "%%i" ^|find "Keywords"') do (
  5.                 set "str=%%b"
  6.                 set "str=!str:,=;!"
  7.                 set "str=!str: =!"
  8.                 echo %%~fi !str!
  9.         )
  10. ))>1.txt
  11. endlocal
  12. pause
复制代码


修改
  1. @echo off
  2. rem 如 str=参数1, 参数2
  3. set /p str=输入参数:
  4. for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  5.         exiftool -overwrite_original -iptc:Keywords="%str%" "%%i"
  6. )
  7. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
czjt1234 + 1 不错不错

查看全部评分

 楼主| 发表于 2023-5-6 16:35:41 | 显示全部楼层
回复 9# 77七


    测试了一下读取和写入都很好用,太感谢了,多谢大佬,谢谢!!
发表于 2023-5-6 21:25:23 | 显示全部楼层
回复 2# 52hz


如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
 楼主| 发表于 2023-5-8 09:58:19 | 显示全部楼层
回复 11# Batcher


    好的,多谢大佬
 楼主| 发表于 2023-5-18 08:24:03 | 显示全部楼层
本帖最后由 52hz 于 2023-5-18 08:26 编辑

回复 9# 77七


    大佬,在使用过程中发现一个问题,当输入参数过长的时候会提示:
    Waring:【Minor】IPTC:Keywords exceeds length limit  <truncated> - 图片名称.jpg
    运行窗口截图:https://imgse.com/i/p9Wvq61
    我翻译了一下,说是超过长度限制,被截断。修改后的图片标记只截取了输入参数的前60个字符。
    请问这个有解决办法么,或者有没有其它不限制长度的命令行工具可以代替?
发表于 2023-5-18 11:08:56 | 显示全部楼层
  1. chcp 65001
  2. rem 查看
  3. exiftool -s -m -FileName -iptc:keywords -T *.jpg
  4. rem 修改
  5. exiftool -m -overwrite_original -iptc:keywords="values1,value2" *.jpg
  6. rem exif与iptc属性都是unicode,请将脚本保存为utf-8编码
复制代码

评分

参与人数 1技术 +1 收起 理由
77七 + 1 专业!

查看全部评分

发表于 2023-5-18 11:10:49 | 显示全部楼层
回复 13# 52hz

chatgpt答案,这个可以设置超60个字符,替换一下修改那一行就行
  
  1. Exiv2是一款开源的图像元数据编辑器,可以修改图片的IPTC信息,包括Keywords关键词。下面是修改图片IPTC:Keywords参数的示例:

  2. 假设我们要修改一张名为"example.jpg"的图片的Keywords参数为"landscape, nature, mountain",则需要使用以下命令:

  3. exiv2 -M "set Iptc.Application2.Keywords landscape nature mountain" example.jpg
  4. 其中,-M指定对元数据进行操作,"set Iptc.Application2.Keywords"表示设置IPTC的Keywords参数,后面跟着要设置的关键词,多个关键词之间用空格隔开。最后是要修改的图片文件名。

  5. 执行以上命令后,应该会看到如下输出:

  6. setting Iptc.Application2.Keywords to landscape, nature, mountain
  7. 这说明Keywords参数已经成功被修改了。
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 12:13 , Processed in 0.023967 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表