Dropoverシェルフ内の画像をAVIFに変換

📄Arrow icon of a page linkDropoverシェルフ内の画像をWebPに変換 にてスクリプトを作成しましたが、AVIF形式へ変換する必要が出てきたので、少しコードを変更してみた。

前提条件

  • macOS
  • Dropoverアプリがインストールされていること
  • Homebrewがインストールされていること
  • brewで ImageMagickとlibheifライブラリがインストールされていること

変換スクリプト

#!/bin/bash

入力ファイルの確認
if [ "$#" -eq 0 ]; then
    echo "使用方法: $0 <入力画像ファイル...>"
    exit 1
fi

一時ディレクトリを作成
temp_dir="/tmp"


ImageMagickがインストールされているか確認
MAGICK=""
if command -v magick &> /dev/null; then
    MAGICK=$(which magick)
elif [ -f "/usr/local/bin/magick" ]; then
    MAGICK="/usr/local/bin/magick"
elif [ -f "/opt/homebrew/bin/magick" ]; then
    MAGICK="/opt/homebrew/bin/magick"
elif command -v convert &> /dev/null; then
    MAGICK=$(which convert)
elif [ -f "/usr/local/bin/convert" ]; then
    MAGICK="/usr/local/bin/convert"
elif [ -f "/opt/homebrew/bin/convert" ]; then
    MAGICK="/opt/homebrew/bin/convert"
else
    osascript -e 'display notification "ImageMagickがインストールされていません。Homebrewでインストールしてください: brew install imagemagick" with title "エラー"'
    exit 1
fi

変換済みファイルのリスト
converted_files=()

各入力ファイルを処理
for input_file in "$@"; do
    # 入力ファイルが存在するか確認
    if [ ! -f "$input_file" ] || [ ! -s "$input_file" ]; then
        osascript -e "display notification \"${input_file}が存在しないか、空のファイルです\" with title \"エラー\""
        continue
    fi

    # 入力ファイルが画像形式か確認
    file_type=$(file -b --mime-type "$input_file")
    if [[ ! "$file_type" =~ ^image/(jpeg|png|gif|bmp|tiff|webp) ]]; then
        osascript -e "display notification \"${input_file}はサポートされていないファイル形式です。PNG、JPG、GIF、BMP、TIFF、WebPのみ対応しています。\" with title \"エラー\""
        continue
    fi

    # 出力ファイル名を設定
    output_file="$temp_dir/$(basename "${input_file%.*}").avif"

    # ImageMagickで全ての形式をAVIFに変換(高圧縮設定)
    "$MAGICK" "$input_file" -quality 60 -define heic:compression-effort=9 -define heic:chroma-subsampling=444 "$output_file" 2>/dev/null

    # 変換が成功したか確認
    if [ ! -f "$output_file" ] || [ ! -s "$output_file" ]; then
        osascript -e "display notification \"${input_file}のAVIF変換に失敗しました\" with title \"エラー\""
        continue
    fi

    # 変換済みファイルをリストに追加
    converted_files+=("$output_file")
done

変換済みファイルがある場合、Dropoverに送信
if [ ${#converted_files[@]} -gt 0 ]; then
    # ファイルシステムの同期を強制
    sync

    # 少し待ってファイルの書き込みが完了するのを待つ
    sleep 1

    # Dropoverが利用可能か確認
    if ! command -v open &> /dev/null; then
        osascript -e 'display notification "Dropoverアプリが見つかりません" with title "エラー"'
        exit 1
    fi

    # 各ファイルをDropoverに送信
    for file in "${converted_files[@]}"; do
        open -a Dropover "$file"
    done

    # 処理完了の通知
    if [ ${#converted_files[@]} -gt 1 ]; then
        osascript -e "display notification \"${#converted_files[@]}個のファイルの変換が完了しました\" with title \"成功\""
    else
        osascript -e 'display notification "AVIF画像をDropoverに送信しました" with title "成功"'
    fi
else
    osascript -e 'display notification "変換に成功したファイルがありません" with title "エラー"'
fi
convert2avif.sh

WebP形式より圧縮してますので、品質に粗いようだと、-quality 60 -define heic:compression-effort=9 -define heic:chroma-subsampling=444 の箇所を調整してみてください。

圧縮率パラメータの説明

パラメータ 設定値 説明 推奨範囲
-quality 60 画像の品質を指定します。数値が小さいほど圧縮率が高く(ファイルサイズが小さく)なりますが、画質が低下します。 50-85(60-70が一般的)
heic:compression-effort 9 圧縮の努力レベルを指定します。0-9の範囲で、9が最高の圧縮率(最も時間がかかる)です。 4-9(9で最高圧縮)
heic:chroma-subsampling 444 色情報のサブサンプリング方式を指定します。444は最高品質(色情報を間引かない)、420は圧縮率優先です。 444(高品質)、422(中品質)、420(高圧縮)
品質調整の目安
  • 高品質重視: -quality 75-85 -define heic:chroma-subsampling=444
  • バランス型: -quality 65-75 -define heic:chroma-subsampling=422
  • 高圧縮重視: -quality 50-60 -define heic:chroma-subsampling=420