本文目录导读:

我需要了解一些具体信息才能给出最合适的脚本方案,先问几个关键问题:
我需要了解的信息
-
图片说明来自哪里?
- CSV/Excel 表格中已写好的说明文字?
- 手动输入?
- 从文件名或 EXIF 信息中提取?
-
说明文字要加到哪里?
- 修改图片文件本身的元数据(如 EXIF 的 Description 字段)?
- 生成带文字水印的新图片?
- 写入同名的 .txt 文件/侧边栏文件?
- 导入到照片管理软件(如 Lightroom)的数据库?
-
使用什么操作系统?
- Windows(PowerShell/Batch)
- macOS/Linux(Bash)
常见场景的脚本示例
场景1:将 CSV 中的说明写入图片 EXIF 元数据(Python)
import csv
from PIL import Image
from PIL.ExifTags import Base
import piexif
import os
# CSV 格式:filename, description
# example.csv 内容:
# photo1.jpg,这是第一张照片
# photo2.jpg,这是第二张照片
def add_description_from_csv(csv_path, image_folder):
with open(csv_path, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
filename, description = row[0], row[1]
image_path = os.path.join(image_folder, filename)
if not os.path.exists(image_path):
print(f"文件不存在: {image_path}")
continue
# 读取图片
img = Image.open(image_path)
# 获取或创建 EXIF 数据
if 'exif' in img.info:
exif_data = piexif.load(img.info['exif'])
else:
exif_data = {'Exif': {}, '0th': {}, '1st': {}, 'GPS': {}, 'Interop': {}}
# 添加说明到 ImageDescription 字段
exif_data['Exif'][piexif.ExifIFD.ImageDescription] = description
# 保存修改
exif_bytes = piexif.dump(exif_data)
img.save(image_path, 'jpeg', exif=exif_bytes)
print(f"已为 {filename} 添加说明: {description}")
# 使用示例
add_description_from_csv('example.csv', './photos/')
场景2:批量添加文字水印到图片(Python + Pillow)
from PIL import Image, ImageDraw, ImageFont
import os
def add_text_watermark(image_folder, descriptions_dict, font_size=30):
"""
descriptions_dict 格式: {'photo1.jpg': '这是说明文字1', 'photo2.jpg': '这是说明文字2'}
"""
for filename, description in descriptions_dict.items():
image_path = os.path.join(image_folder, filename)
if not os.path.exists(image_path):
print(f"文件不存在: {image_path}")
continue
# 打开图片
img = Image.open(image_path).convert('RGBA')
# 创建一个透明层来放文字
txt_layer = Image.new('RGBA', img.size, (255, 255, 255, 0))
draw = ImageDraw.Draw(txt_layer)
# 尝试加载中文字体
try:
font = ImageFont.truetype("arial.ttf", font_size)
except:
# 如果找不到字体,用默认字体
font = ImageFont.load_default()
# 在图片底部添加文字(带半透明背景)
text_position = (10, img.height - font_size - 20)
draw.rectangle([0, img.height - font_size - 30, img.width, img.height],
fill=(0, 0, 0, 128))
draw.text(text_position, description, font=font, fill=(255, 255, 255, 255))
# 合并图层并保存
watermarked = Image.alpha_composite(img, txt_layer)
watermarked = watermarked.convert('RGB') # 转换为 RGB 以保存为 JPEG
watermarked.save(os.path.join(image_folder, f"wm_{filename}"))
print(f"已添加水印: {filename}")
# 使用示例
descriptions = {
'photo1.jpg': '2024年春节聚会',
'photo2.jpg': '公司团建活动'
}
add_text_watermark('./photos/', descriptions)
场景3:批量重命名图片(说明文字作为文件名)
# Windows PowerShell 脚本
# 假设有一个 descriptions.csv 文件,格式:旧文件名,新说明
param(
[string]$csvFile = "descriptions.csv",
[string]$imageFolder = "."
)
Import-Csv $csvFile | ForEach-Object {
$oldName = $_.OldName
$newName = $_.NewDescription + [System.IO.Path]::GetExtension($oldName)
$oldPath = Join-Path $imageFolder $oldName
$newPath = Join-Path $imageFolder $newName
if (Test-Path $oldPath) {
Rename-Item -Path $oldPath -NewName $newName
Write-Host "已重命名: $oldName -> $newName"
} else {
Write-Host "文件不存在: $oldName"
}
}
场景4:交互式批量添加说明(手动输入)
#!/bin/bash
# macOS/Linux Bash 脚本
echo "批量图片说明添加工具"
echo "=================="
# 获取当前目录下所有图片文件
images=(*.jpg *.jpeg *.png *.gif *.bmp 2>/dev/null)
if [ ${#images[@]} -eq 0 ]; then
echo "当前目录下没有找到图片文件"
exit 1
fi
echo "找到 ${#images[@]} 个图片文件"
echo ""
# 为每个图片输入说明
declare -A descriptions
for img in "${images[@]}"; do
echo "当前图片: $img"
read -p "请输入说明文字(输入空行跳过): " desc
if [ -n "$desc" ]; then
descriptions[$img]=$desc
# 可以选择写入同名txt文件
echo "$desc" > "${img%.*}.txt"
echo "已保存说明到 ${img%.*}.txt"
fi
echo ""
done
echo "完成!共处理 ${#descriptions[@]} 个图片"
你需要哪种方案?
请告诉我:
- 你的图片说明数据来源
- 说明要保存到哪里
- 运行环境
我可以根据你的具体情况提供完整的脚本代码。