📄Dropoverシェルフ内の画像を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