MacOS 系统下安装并使用 ImageMagick

48次阅读

共计 3843 个字符,预计需要花费 10 分钟才能阅读完成。

ImageMagick 是一款功能强大且广泛使用的开源图像处理工具套件,支持多种编程语言调用,适用于脚本化或自动化图像处理。

https://imagemagick.org/

优点:

  1. 跨平台支持

    • 支持 Linux、Windows、macOS,兼容性强。
  2. 多格式处理

    • 支持 200+ 图像格式(如 PNG、JPEG、TIFF、PDF、SVG),甚至可处理 RAW 相机文件。
  3. 脚本化能力

    • 通过命令行(convertmogrify 等)批量处理图像,适合自动化任务。
  4. 高级功能

    • 支持复杂操作:合成、蒙版、色彩空间转换、动态 GIF 生成、文本渲染等。
  5. 编程接口

    • 提供 Perl、Python、PHP、C/C++ 等语言的 API,方便集成到应用中。
  6. 开源免费

    • 采用 Apache 2.0 许可证,可自由使用和修改。

缺点:

  1. 内存消耗大

    • 处理大文件或批量操作时可能占用较高内存。
  2. 安全风险

    • 过去曾曝出漏洞(如 Ghostscript 依赖导致的远程执行漏洞),需保持版本更新。
  3. 性能局限

    • 某些操作(如超大图像处理)速度较慢,不如专用工具(如 libvips)。

安装 ImageMagick

打开 终端.app 复制粘贴并执行下面的代码即可:

# 需要先安装 Homebrew 软件包管理系统
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 如果已经安装过 Homebrew 则可以忽略上面的指令,直接执行下面这条
brew install imagemagick

# 验证是否安装成功
convert -version

结果如图显示:

MacOS 系统下安装并使用 ImageMagick

ImageMagick + 自建 API

通过 API 接口指令自动批量处理图片的尺寸和体积,可以结合 Web 框架封装为 API 接口:

from flask import Flask, request, send_file
import subprocess
import os

app = Flask(__name__)

@app.route('/resize', methods=['POST'])
def resize_image():
    file = request.files['image']
    width = request.form.get('width', '500')
    height = request.form.get('height', '500')
    input_path = '/tmp/input.jpg'
    output_path = '/tmp/output.jpg'

    file.save(input_path)
    subprocess.run(['convert', input_path, '-resize', f'{width}x{height}', output_path])
    return send_file(output_path, as_attachment=True)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

FFmpeg + ImageMagick 组合的完整工作流

FFmpeg 和 ImageMagick 的组合在多媒体处理中非常强大,FFmpeg 擅长视频 / 音频处理,而 ImageMagick 专注于静态 / 动态图像的高级编辑 ,两者结合可以覆盖从视频帧提取、图像处理到动态图像生成的完整工作流。

视频帧提取 + 图像处理

从视频中提取关键帧并批量处理(如加水印、调色、压缩):

# 提取视频所有帧为 PNG
ffmpeg -i input.mp4 frame_%04d.png

# 使用 ImageMagick 批量处理,如缩放到 50% 并转灰度
mogrify -resize 50% -colorspace Gray frame_*.png

# 将处理后的帧重新合成为视频
ffmpeg -framerate 30 -i frame_%04d.png -c:v libx264 output.mp4

GIF/ 动态图像生成

将视频片段转为高质量 GIF 或 APNG,因为 FFmpeg 提取帧 + ImageMagick 优化,如调色、降噪、压缩,比单独使用任一工具效果更好:

# 用 FFmpeg 提取视频片段为 PNG 序列
ffmpeg -i input.mp4 -ss 00:00:10 -t 5 -vf fps=15 frame_%04d.png

# 用 ImageMagick 生成优化后的 GIF 减少颜色数、优化帧
convert -delay 7 -loop 0 frame_*.png -layers Optimize output.gif

视频加水印

在视频每一帧叠加动态水印(如透明 PNG 或文字):

# 生成文字 + 透明度的水印图
convert -size 300x100 xc:none -font Arial -pointsize 30 -fill white -draw "text 10,50 'My Watermark'" -channel A -evaluate multiply 0.5 watermark.png

# 用 FFmpeg 叠加水印,例如位置在右下角
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4

视频缩略图 / 封面生成

从视频中提取关键帧并拼合成缩略图网格:

# 用 FFmpeg 每 10 秒提取一帧
ffmpeg -i input.mp4 -vf fps=1/10 thumb_%02d.jpg

# 用 ImageMagick 拼合为 3x3 网格
montage thumb_*.jpg -tile 3x3 -geometry +5+5 collage.jpg

通过脚本自动运行 ImageMagick 批量处理压缩包里的图片

创建一个名为 process_images.sh 的脚本文件,粘贴如下内容:

#!/bin/bash

# 设置日志函数
log() {echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# 检查是否安装了 optipng,如果没有则安装
if ! command -v optipng &> /dev/null; then
    log " 正在安装 optipng..."
    brew install --quiet optipng || log " 警告: 无法安装 optipng,PNG 优化将被跳过 "
fi

# 查找当前目录下的所有 zip 文件
zip_files=$(find . -maxdepth 1 -type f -name "*.zip")

# 检查是否找到 zip 文件
if [-z "$zip_files"]; then
    log " 错误: 当前目录下没有找到 zip 文件 "
    exit 1
fi

# 处理每个 zip 文件
for input_zip in $zip_files; do
    # 获取不带路径和扩展名的文件名
    filename=$(basename "$input_zip" .zip)
    output_dir="${filename}_extracted"
    processed_zip="${filename}_processed.zip"

    log " 处理压缩包: $input_zip"

    # 创建输出目录
    mkdir -p "$output_dir"

    # 解压文件
    log " 解压到目录: $output_dir"
    unzip -q "$input_zip" -d "$output_dir"

    # 进入输出目录
    cd "$output_dir" || {log " 错误: 无法进入目录 $output_dir"; continue;}

    # 创建原始图片备份
    log " 创建原始图片备份 "
    mkdir -p original_backup

    # 查找所有图片文件并复制到备份目录
    find . -maxdepth 1 -type f \(-name "*.jpg" -o -name "*.jpeg" -o -name "*.png" \) -exec cp {} original_backup/ \;

    # 处理图片
    jpg_files=$(find . -maxdepth 1 -type f \( -name "*.jpg" -o -name "*.jpeg" \))
    png_files=$(find . -maxdepth 1 -type f -name "*.png")

    if [-n "$jpg_files"]; then
        log " 调整 JPG/JPEG 图片大小和质量 "
        mogrify -resize 800x $jpg_files
        mogrify -quality 80% $jpg_files
    fi

    if [-n "$png_files"] && command -v optipng &> /dev/null; then
        log " 优化 PNG 图片 "
        optipng -o7 $png_files 2>/dev/null || log " 警告: PNG 优化失败 "
    fi

    # 返回上级目录
    cd ..

    # 创建处理后的压缩包
    log " 创建处理后的压缩包: $processed_zip"
    zip -rq "$processed_zip" "$output_dir"

    log " 完成处理: $input_zip -> $processed_zip"
done

log " 所有压缩包处理完成 "

脚本说明:

  1. 自动检测功能 :使用 find 命令查找当前目录下的所有 .zip 文件
  2. 动态命名 :根据输入文件名自动生成输出目录和处理后的压缩包名称
  3. 健壮性增强
    • 添加了日志功能,便于跟踪处理过程
    • 增加了错误处理和检查
    • 使用 find 命令查找图片文件,避免通配符匹配失败的问题
  4. 批量处理 :可以一次处理多个压缩包文件
  5. 保留原功能 :保留了原脚本中的图片处理功能(调整大小、优化质量、PNG 压缩)

这个脚本会自动检测当前目录下的所有 .zip 文件,并为每个文件创建相应的处理流程,最终生成处理后的压缩包。

全文完
 
西西
📝创作说明:本文由 西西 于2025-05-02发表,共计3843字。
🉑转载说明:本作品采用 “知识共享署名-非商业性使用 4.0 国际许可协议” 进行许可。除特殊说明外,您可以自由的转载和修改,但请务必注明来源且不可用于商业目的。