前言 手头有上百张照片打印,需要在照片添加上拍摄日期水印,最原始的方法就是使用Photoshop给每张照片逐一添加。Photoshop的动作录制,可以实现批量相同日期,但每张照片拍摄日期都不尽相同,显然不能满足需求。
当然,Photoshop还支持自定义脚本,实现照片批量处理。脚本实现效果如下:
自动化脚本 脚本代码如下,如有更新请查看github:
https://github.com/laozeng1024/photoshop
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 /* 文件:auot_add_date.js 功能:photoshop脚本从exif获取日期,自动添加日期水印。如没有exif日期信息,则从文件名从读取日期。 作者:laozeng,https://github.com/laozeng1024 */ //自定义字符串,如“@上海”,使用urlencode编码 var customStr = "%40%E4%B8%8A%E6%B5%B7"; //exif中“日期时间”字段名称,urlencode编码 var photoTimeStr = "%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4"; var inputFolder = Folder.selectDialog("请选择需要添加日期水印图片所在文件夹:"); var outFolder = Folder.selectDialog("选择图片保存输出的文件夹:"); //判断文件夹是否存在 if (inputFolder != null && inputFolder != null) { //获得文件夹下的所有图片 var fileList = inputFolder.getFiles(); //遍历图片 for (var i = 0; i < fileList.length; i++) { //判断图片是否正常文件,并且处于非隐藏状态 if (fileList[i] instanceof File && fileList[i].hidden == false) { //打开遍历到的图片 var docRef = open(fileList[i]); //设置另存路径文件名,重命名为:new_原文件名 var fileout = new File(outFolder+'/new_'+ basename(fileList[i])) //获得exif照片日期,可自行加自定义文字customStr //photoTime = getExifData(docRef) + decodeURIComponent(customStr) photoTime = getExifData(docRef) //如果exif没有日期数据,从文件名读取 if (photoTime == 0) { photoTime = basename(fileList[i]) photoTime = photoTime.toString().slice(0, -4) } //新建图层 var layerRef = docRef.artLayers.add(); //设置为文字图层 layerRef.kind = LayerKind.TEXT; //设置图层文字 layerRef.textItem.contents = photoTime; //根据图片宽度比例,设置文字大小 layerRef.textItem.size = docRef.width/20; //定义颜色 var color = new RGBColor(); //设置red属性 color.red = 255; //设置green属性 color.green = 255; //设置blue属性 color.blue = 255; //定义水印文字的颜色 var sc = new SolidColor(); //设置[sc]对象的[rgb]属性的值为变量[color] sc.rgb = color; //将文本图层的字体颜色设置为变量[sc] layerRef.textItem.color = sc; //设置文本图层透明度 layerRef.fillOpacity = 90; //将文本图层向下移动。调节日期水印左右和上下位置 layerRef.translate(250, docRef.height/1.15 - 72); //合并文本图层至背景图层 layerRef.merge(); //另存照片 //定义一个变量[asCopy],用来指定图片以副本的方式保存 var asCopy = true; //定义一个变量[extensionType],用来指定图片名称的后缀为小写的.jpg var extensionType = Extension.LOWERCASE; //定义一个变量[options],用来指定图片保存的格式为JPG。PNG为PNGSaveOptions var options = JPEGSaveOptions; docRef.saveAs(fileout, options, asCopy, extensionType); //操作完成后,直接关闭文档 docRef.close(SaveOptions.DONOTSAVECHANGES); } } alert("添加日期水印,已处理完成!") } //获取exif中的日期 function getExifData(doc) { var exifData = doc.info.exif; var photoTime = 0 for(j = 0; j < exifData.length; j++ ) { encodeStr = encodeURIComponent(exifData[j][0]) switch(encodeStr) { //urlencode 中文再判断 //日期时间 case photoTimeStr: photoTime = exifData[j][1]; break; } } return photoTime; } //获取文件名 function basename(str) { str = str.toString(); var idx = str.toString().lastIndexOf('/') idx = idx > -1 ? idx : str.lastIndexOf('\\') if (idx < 0) { return str } return str.substring(idx + 1); }
使用方法
将脚本代码保存到本地。
photoshop-文件-脚本-浏览,选择脚本js,根据提示选择照片所在目录,即可批量添加日期水印。
注意事项
如照片经过处理没有exif日期信息,或exif无法读取日期信息,则从文件名从读取日期。可将照片文件名命名为日期格式,如2020-06-01.jpg
相机语言为英文,exif日期字段可能为英文,需要自行修改“photoTimeStr”字段,并用urlencode编码。
可通过customStr字段自定义日期水印外的文字,同样需要urlencode编码。
附录:如何在Photoshop调试js脚本 方法1:最原始方法,在js脚本中使用alert弹窗调试。
方法2:利用mac脚本编辑器来执行js代码,错误会在编辑器中提示。如Adobe Photoshop 2020中调试脚本为:
1 2 3 tell application "Adobe Photoshop 2020" do javascript "#include /Users/person/04Photo/John/auto_add_date.js" end tell