PhotoShop CS6自动添加照片exif脚本
本脚本代码是大D在Google上翻找到的,原帖出自色影无忌,但经过多方转载和修改,原帖地址已经找寻不到了。无论如何,还是对本脚本的原作者及修改者表示感谢。
经常玩各种摄影论坛的朋友自然对照片上填写的数据信息很感兴趣,这也是提高自己水平的一个重要方式。
简单的添加可以通过光影魔术手的边框功能来完成,但是对于喜欢折腾的玩主来说,光影魔术手显然不能满足玩主,功能强大的PS就是不二之选了。
废话不多说,直接上代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 |
displayDialogs = DialogModes.NO; var defaultRulerUnits = preferences.rulerUnits; preferences.rulerUnits = Units.PIXELS; //将一个长字串分解成单个字符串 function explodeArray(item) { var i=0; var Count=0; var tempString=new String(item); tempArray=new Array(1); do{ i=tempString.indexOf(":"); if(i>0) tempString=tempString.substr(i+1,tempString.length-i-1); i=tempString.indexOf(">"); if(i>0) { tempArray[Count]=tempString.substr(0,i); tempString=tempString.substr(i+1,tempString.length-i-1); Count ++; } i=tempString.indexOf("0) { tempArray[Count]=tempString.substr(0,i); tempString=tempString.substr(i-1,tempString.length-i+1); Count ++; } }while (tempString.indexOf("")>0); tempArray[Count]=tempString; return tempArray; } var AD = activeDocument; var resRatio = AD.resolution/72; if(resRatio!=1){ AD.resizeImage(AD.width.value,AD.height.value,72); } var heightVar = AD.height.value+2; var photoWidth = AD.width.value; var photoHight = AD.height.value; //获取RAW保存的信息 var exifData = AD.xmpMetadata.rawData.toString(); //将EXIF信息分成单个的相关信息 explodeArray(exifData); var stringTemp=""; //临时字串 var make=""; //相机公司 var model=""; //相机型号 var camera=""; //相机 var lens=""; //镜头类型 var apertureValue=""; // var lensUsed=""; //使用的镜头 var focalLength=""; //焦距 var exposureTime=""; //快门 var fNumber=""; //光圈 var ISOSpeedRatings=""; //ISO设置 var exposureBiasValue=""; //曝光补偿 var exposureProgram=""; //曝光程序 var Fired=""; //闪光模式 var dateTimeOriginal=""; //拍摄时间 //改成你自己想写的,比如版权所有和你自己的网名等 //如果为空,将采用相机设置的名字 var creator="derek_s_大D"; //拍摄者的信息,可以在前面的引号里面加上自己想要加的信息 var i=0; var j=0; var k=0; var dateArray1=""; var dateArray2=""; var monthsArray=""; var phoDate = ""; var phoTime = ""; //Photoshop CS获取EXIF信息 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; //快门速度 if(stringTemp.indexOf("ExposureTime")!=-1){ exposureTime = tempArray[n+1]; break; } } //光圈大小 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(stringTemp.indexOf("FNumber")!=-1){ fNumber = tempArray[n+1]; break; } } //拍摄日期、时间 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(stringTemp.indexOf("DateTimeOriginal")!=-1){ dateTimeOriginal = tempArray[n+1]; break; } } //使用焦距 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(tempArray[n]=="FocalLength"){ focalLength = tempArray[n+1]; break; } } //ISO设置 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(stringTemp.indexOf("ISOSpeedRatings")!=-1){ ISOSpeedRatings = "ISO"+tempArray[n+5]; break; } } //曝光补偿 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(stringTemp.indexOf("ExposureBiasValue")!=-1){ exposureBiasValue = tempArray[n+1]; break; } } //曝光程序 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(stringTemp.indexOf("ExposureProgram")!=-1){ exposureProgram = tempArray[n+1]; break; } } //闪光模式 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(stringTemp.indexOf("Fired")!=-1){ Fired = tempArray[n+1]; break; } } //使用镜头类型 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(tempArray[n]=="Lens"){ lens=tempArray[n+1]; break; } } //相机厂商 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(stringTemp.indexOf("Make")!=-1){ make = tempArray[n+1]; break; } } //相机型号 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(stringTemp.indexOf("Model")!=-1){ var model = tempArray[n+1]; break; } } //对于有的相机型号不包括制造商部分 //camera = make+model; //对于有的相机型号包括制造商部分 camera = model; //相机所有者 for(n = 0; n < tempArray.length; n ++) { stringTemp=tempArray[n]; if(stringTemp.indexOf("creator")!=-1 && creator==""){ creator = tempArray[n+5]; break; } } //检查快门速度(全部保留到小数点后一位) dateArray1 = exposureTime.split("/"); i = dateArray1[0]; j = dateArray1[1]; if(i/j>=1) exposureTime=parseInt(i/j)+"."+(i-parseInt(i/j)*j); else{ j=parseInt(j/i); i=1; exposureTime=i+"/"+j; } //检查光圈大小 dateArray1 = fNumber.split("/"); i = dateArray1[0]; j = dateArray1[1]; if(j>1) fNumber=i/j; else fNumber=i; //检查焦距 dateArray1 = focalLength.split("/"); i = dateArray1[0]; j = dateArray1[1]; if(j>1) focalLength=parseInt(i/j); else focalLength=i; //检查曝光补偿 dateArray1 = exposureBiasValue.split("/"); i = dateArray1[0]; j = dateArray1[1]; if(i>0) exposureBiasValue="+"+(parseInt(i*10/j))/10; else exposureBiasValue=(parseInt(i*10/j))/10; //检查曝光程序 //程序顺序根据相机差异调整 dateArray1= exposureProgram; dateArray2 = ["Manual", "Program", "Aperture", "Shutter", "A-DEP"]; exposureProgram = dateArray2[dateArray1-1]; //检查闪光模式 dateArray1 = Fired; if(dateArray1.indexOf("True")!=-1) Fired="FlashOn"; else Fired="FlashOff"; //改变日期格式 dateArray1 = dateTimeOriginal.split("T"); phoDate = dateArray1[0]; phoTime = dateArray1[1]; //日期转换为英文格式(如Jun 22 2005),不喜欢可以在下面这一段所有行的脚本前把注释符号"//"加上。 dateArray2 = phoDate.split("-"); monthsArray =["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; phoDate = monthsArray[dateArray2[1]-1]+" "+dateArray2[2]+" "+dateArray2[0]; dateArray2 = phoTime.split("+"); phoTime = dateArray2[0]; //你有什么镜头,就根据镜头和最大焦距改吧 // 镜头这一部分需要先查看PS软件能够认出你的照片里的镜头信息是什么程度,具体方法是用PS打开一张图之后查看file info,快捷键是:alt+shift+ctrl+I。比如尼康的AF 85mm f/1.4D这只镜头,PS认出"85.0 mm f/1.4";宾得的DA 70mm f/2.4 limited这只镜头,PS认出"70mm f/2.4";佳能EF 70-200mm f/2.8L IS USM这支镜头,PS认出"EF70-200mm f/2.8L IS USM"。在这里每一个空格或者小数点之类的都是很重要的,请勿根据自己的猜想随意修改,不然容易出错,另外,如果不用RAW拍摄后转成的jpg,似乎并 不能保证镜头数据的完整性。可以自行添加镜头数据使得你的镜头库变得完善,但是注意脚本的格式。还有一个问题是佳能用户在拍摄RAW之后用DPP转出的 JPG中似乎不包含镜头的相关信息,这样的JPG采用此脚本时无法显示镜头。经不完全测试,Lightroom转出的JPG可以。 if(lens != "") { //尼康镜头 //此处无法分别老的50 1.4D和新的50 1.4G,因为无论新老镜头,都只能读出"50.0 mm f/1.4",因此写代码时,各取所取吧~如果您有同一只镜头的新老两个版本...... if(lens.indexOf("18.0-70.0 mm f/3.5-4.5")!=-1){ lensUsed = "AF-S DX Nikkor 18-70mm f/3.5-4.5G IF-ED "; } if(lens.indexOf("24.0-120.0 mm f/3.5-5.6")!=-1){ lensUsed = "AF-S VR Nikkor 24-120mm f/3.5-5.6G IF-ED "; } if(lens.indexOf("14.0-24.0 mm f/2.8")!=-1){ lensUsed = "AF-S Nikkor 14-24mm f/2.8G ED"; } if(lens.indexOf("24.0-70.0 mm f/2.8")!=-1){ lensUsed = "AF-S Nikkor 24-70mm f/2.8G ED"; } if(lens.indexOf("70.0-200.0 mm f/2.8")!=-1){ lensUsed = "AF-S VR Nikkor 70-200mm f/2.8G IF-ED"; } if(lens.indexOf("50.0 mm f/1.4")!=-1){ lensUsed = "AF Nikkor 50mm f/1.4D"; } if(lens.indexOf("85.0 mm f/1.4")!=-1){ lensUsed = "AF Nikkor 85mm f/1.4D IF"; } if(lens.indexOf("300.0 mm f/2.8")!=-1){ lensUsed = "AF-S VR Nikkor 300mm f/2.8G ED"; } //佳能镜头 if(lens.indexOf("EF17-40mm f/4L USM")!=-1){ lensUsed = "Canon Zoom Lens EF 17-40mm 1:4 L USM"; } if(lens.indexOf("EF24-105mm f/4L IS USM")!=-1){ lensUsed = "Canon Zoom Lens EF 24-105mm 1:4 L IS USM"; } if(lens.indexOf("EF24-70mm f/2.8L USM")!=-1){ lensUsed = "Canon Zoom Lens EF 24-70mm 1:2.8 L USM"; } if(lens.indexOf("EF70-200mm f/2.8L IS USM")!=-1){ lensUsed = "Canon Zoom Lens EF 70-200mm 1:2.8 L IS USM"; } if(lens.indexOf("EF70-200mm f/2.8L USM")!=-1){ lensUsed = "Canon Zoom Lens EF 70-200mm 1:2.8 L USM"; } if(lens.indexOf("EF100-400mm f/4.5-5.6L IS USM")!=-1){ lensUsed = "Canon Zoom Lens EF 100-400mm 1:4.5-5.6 L IS USM"; } if(lens.indexOf("EF14mm f/2.8L II USM")!=-1){ lensUsed = "Canon Lens EF 14mm 1:2.8 L II USM"; } if(lens.indexOf("EF24mm f/1.4L II USM")!=-1){ lensUsed = "Canon Lens EF 24mm 1:1.4 L II USM"; } if(lens.indexOf("EF35mm f/1.4L USM")!=-1){ lensUsed = "Canon Lens EF 35mm 1:1.4 L USM"; } if(lens.indexOf("EF35mm f/2")!=-1){ lensUsed = "Canon Lens EF 35mm 1:2"; } if(lens.indexOf("EF50mm f/1.2L USM")!=-1){ lensUsed = "Canon Lens EF 50mm 1:1.2 L USM"; } if(lens.indexOf("EF50mm f/1.4 USM")!=-1){ lensUsed = "Canon Lens EF 50mm 1:1.4 USM"; } if(lens.indexOf("EF50mm f/1.8 II")!=-1){ lensUsed = "Canon Lens EF 50mm 1:1.8 II"; } if(lens.indexOf("EF85mm f/1.2L II USM")!=-1){ lensUsed = "Canon Lens EF 85mm 1:1.2 L II USM"; } if(lens.indexOf("EF300mm f/2.8L IS USM")!=-1){ lensUsed = "Canon Lens EF 300mm 1:2.8 L IS USM"; } if(lens.indexOf("EF300mm f/4L IS USM")!=-1){ lensUsed = "Canon Lens EF 300mm 1:4 L IS USM"; }if(lens.indexOf("EF100mm f/2.8 Macro USM")!=-1){ lensUsed = "Canon Lens EF 100mm f/2.8 Macro USM"; }if(lens.indexOf("EF50mm f/2.5 Macro")!=-1){ lensUsed = "Canon Lens EF 50mm f/2.5 Macro"; } //佳能相机镜头里面的二代标示是"II" //下面是原作者写的百微,我没敢采用。 //if(lens.indexOf("100.0 mm")!=-1){ //lensUsed = "Canon Macro 100mm F2.8 USM"; //} } else { //如果没有镜头信息,就使用原来的办法比较 //var focLength=parseInt(focalLength); //if(focLength>=28 && focLength70 && focLengthphotoHight){ var fWidth = parseInt(photoWidth/60); var fHight = parseInt(photoHight/40); } if(photoWidth var fWidth = parseInt(photoWidth/40); var fHight = parseInt(photoHight/60); } //字体左边距和下边距 var tLeft = parseInt(fWidth/2+10); var tHight = parseInt(fHight/2); //字号 var tSize = parseInt(fWidth/2); AD.resizeCanvas(AD.width.value+fWidth,AD.height.value+fHight, AnchorPosition.MIDDLECENTER); //底部再加宽点,便于写字,这里将下边的边框加倍 //如果觉得还是不够宽,可以将第三行代码前的两斜杠去掉,或者自己在算式中手动加入fhight。 AD.resizeCanvas (AD.width.value,AD.height.value+fHight+tHight,AnchorPosition.TOPCENTER); AD.resizeCanvas (AD.width.value,AD.height.value+fHight+tHight,AnchorPosition.TOPCENTER); //AD.resizeCanvas (AD.width.value,AD.height.value+fHight+tHight,AnchorPosition.TOPCENTER); //标字和参数 var nameLayer = AD.artLayers.add(); nameLayer.kind = LayerKind.TEXT; var TI = nameLayer.textItem; //右对齐 TI.justification = Justification.RIGHT; //标字的位置1。采用这一行时,这个位置似乎偏高。如对位置不满意,可以手动加入-tHight更改。 //TI.position = [AD.width.value-tLeft,heightVar-tHight]; //标字的位置2。采用这一行时,这个位置似乎偏低。如对位置不满意,可以手动加入+tHight更改。 TI.position = [AD.width.value-tLeft,heightVar+tHight+tHight+tHight]; TI.contents = "Photo by "+creator; //字体、字号、颜色和加粗等 //此处的字体修改时,在PS中作出确认之后,必须进入C:WINDOWSFonts,找到相应字体文件的真实名字,不然无法修改 TI.font = "DFPYuanW5"; //TI.font = "宋体"; TI.size = tSize+16; TI.color = white; //如果为白框,字体为黑色 //TI.color = black; TI.fauxBold = true; var infoLayer = AD.artLayers.add(); infoLayer.kind = LayerKind.TEXT; var TI = infoLayer.textItem; //右对齐,如果左对齐可以省略下面这行 TI.justification = Justification.RIGHT; //标字的位置 TI.position = [AD.width.value-tLeft,heightVar+tHight+tHight+tHight+tHight+tHight]; //显示:相机型号,镜头,焦距,曝光时间,光圈,ISO设置,拍摄日期,版权所有等 // 此处的算式是“内容=变量名称+" 内容 "......”,变量都是上面赋好值的内容如镜头相机拍摄数据等。英文双引号内的内容是会被当做字符直接打上图片的,所以注意,因为引号内的空格就是实 际的空格;回车的代码为“ "u000D" ”。内容可以自行添加删除或者修改。 TI.contents = camera+" with "+lens+" @ "+focalLength+"mm "+exposureProgram+" "+exposureTime+"s f/"+fNumber+" "+exposureBiasValue+"EV "+ISOSpeedRatings+" "+Fired+"u000D"+phoDate+" "+phoTime+" All Rights Reserved"; //TI.contents = k+" "+model; //字体、字号、颜色等。字体需要注意的问题同上。 TI.font = "Museo-300"; TI.size = tSize+6; TI.color = white; //如果为白框,字体为黑色 //TI.color = black; //下面这行是合并图层,想要合并的话,把双斜杠去掉。 //AD.flatten(); // 脚本写完,最后打开你的PS,在file-Scripts-Script events manager内,Photoshop Event选Start Application,Scripts菜单内选Browse然后找到此脚本,点击右边的add加载此脚本,然后点Done。 //此后你只要把一堆照片拖入PS,PS打开它之后就会自动按以上内容加边框,注意别拖太多图,不然你就等吧...... // 当你的电脑跑完所有的边框之后,选择file-Scripts-Image Processor,在第一栏里面选择Use Open Images,在第二栏里卖弄选择Save in Same Location,第三栏选择你要保存的文件类型,比如Jpeg,质量12。在第四栏里可以选择打入你的版权信息,比如 DanielWrenCollins @ 2009 All Rights Reserved,去除ICCF等。然后点run。你就会在图片的来源文件夹内发现一个子文件夹,等你的PS结束运作后,点进去看看吧。 |
将上面的代码拷贝到记事本,另存为.jsx就可以供PS CS6调用了,其他版本应该也可以用,但是大D木有做测试。PS其他版本请将后缀名改为.js。
推荐使用Adobe套件中的Adobe ExtendScript Toolkit组件来弄脚本。
使用方法很简单,打开需要添加的图片之后,文件菜单——脚本——浏览。选择脚本位置打开脚本即可。
不知为什么代码高亮会对代码进行截断。。
换了新的代码高亮插件。。。
脚本下载: 金山快盘
版权声明
转载保留版权: 大D技研室 | 《PhotoShop CS6自动添加照片exif脚本》
本文链接地址:https://www.dadclab.com/archives/1643.jiecao
转载须知:如果您需要转载本文,请将版权信息,版权授权方式,以及本文的链接地址注明,谢谢合作。
已有 14 条评论
发表评论
电子邮件地址不会被公开。 必填项已标注。
大D最近编程方面也努力了不少呢。JS脚本也能写了,加油一个,认真学习,我会一直督促你的。
要在完成学业之后再去摄影哦。
@davelv
那个我表示我刚才看走眼了。恩,还是以学习为重!
@davelv 嗯。。俺会加油滴。。上面那个脚本俺只是修改了一下而已。。嘿嘿。。
目测是JS代码?
谢谢分享。
弹出了错误提示:
错误 21:undefined不是对象。
直线:202
- > dateArray1 = exposureTime.split("/");
请问如何解决。
用的是什么版本的PS?
@bufang 我测了一下,原来是wordpress的插件把代码给修改了,我重新贴了一下代码,你再试试
@大D
你好,谢谢回复。我用的是cs6版本,刚刚试了一下,我这里还是显示同一错误提示。抱歉,我技术上白痴,也许我操作有误吧,能否贴一个写好的文件,下载即可的那种。
@bufang 地址已更新。
@大D
已经下载了,终于能用上了,感谢啊真的感谢你!暑安!
@大D
另,exif信息的“exposureProgram”值在照片上均显示为“undefined”,不知为何故。有空的话帮忙看看。谢谢啦,给你添了不少麻烦。
@bufang exposureProgram信息是曝光程序,我一直用手动档来拍摄,可以用开门优先或者光圈优先拍一张看看,然后在用脚本读一下看看。
@大D 果然。换了一张照片再试就成功啦~非常感谢!
非常感谢,找了很久了,终于在你这里找到了。万分感谢,不过,如果这个动作能设置成一个面板就好了,主要那些exif信息可以自动识别,添加作者信息以及一小段文字说明什么的最好了