Laozeng's Blog

A man is not old until regrets take the place of dreams.

Photoshop脚本实现批量添加日期水印

laozeng's Avatar 2020-08-03 教程

  1. 1. 前言
  2. 2. 自动化脚本
  3. 3. 使用方法
  4. 4. 注意事项
  5. 5. 附录:如何在Photoshop调试js脚本

前言

手头有上百张照片打印,需要在照片添加上拍摄日期水印,最原始的方法就是使用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);
}

使用方法

  1. 将脚本代码保存到本地。
  2. photoshop-文件-脚本-浏览,选择脚本js,根据提示选择照片所在目录,即可批量添加日期水印。

注意事项

  1. 如照片经过处理没有exif日期信息,或exif无法读取日期信息,则从文件名从读取日期。可将照片文件名命名为日期格式,如2020-06-01.jpg
  2. 相机语言为英文,exif日期字段可能为英文,需要自行修改“photoTimeStr”字段,并用urlencode编码。
  3. 可通过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

debug

This article was last updated on days ago, and the information described in the article may have changed.