批量添加图片说明的脚本怎么写

wen 实用脚本 1

本文目录导读:

批量添加图片说明的脚本怎么写

  1. 我需要了解的信息
  2. 常见场景的脚本示例
  3. 你需要哪种方案?

我需要了解一些具体信息才能给出最合适的脚本方案,先问几个关键问题:

我需要了解的信息

  1. 图片说明来自哪里?

    • CSV/Excel 表格中已写好的说明文字?
    • 手动输入?
    • 从文件名或 EXIF 信息中提取?
  2. 说明文字要加到哪里?

    • 修改图片文件本身的元数据(如 EXIF 的 Description 字段)?
    • 生成带文字水印的新图片?
    • 写入同名的 .txt 文件/侧边栏文件?
    • 导入到照片管理软件(如 Lightroom)的数据库?
  3. 使用什么操作系统?

    • 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[@]} 个图片"

你需要哪种方案?

请告诉我:

  1. 你的图片说明数据来源
  2. 说明要保存到哪里
  3. 运行环境

我可以根据你的具体情况提供完整的脚本代码。

抱歉,评论功能暂时关闭!