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

スマホで撮った写真や生成AIで作成した画像のほとんどがJPEGやPNG形式になっている事が多いです。

ブログ記事に投稿する際、現在のWEB界隈での画像形式はWebPやAVIF形式が主流になりつつあります。

JPEGやPNG画像をWebP形式に変換するには、コマンドラインやAutomatorなどを利用すると比較的簡単に出来るかと思いますが、今回はDropover内で変換させたかったので、試作してみました。

ちなみに、macOSで単にファイルをWebP画像へ変換する方法でしたら下記の記事が参考になるかと思います

流れとしては、ClipboardやD&Dで Dropoverのシェルフにストック → 右クリックアクション → WebP形式に変換 → シェルフにWebPとして置換

前提条件

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

変換スクリプト

#!/bin/bash

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

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


# cwebpがインストールされているか確認
if command -v cwebp &> /dev/null; then
    CWEBP=$(which cwebp)
elif [ -f "/usr/local/bin/cwebp" ]; then
    CWEBP="/usr/local/bin/cwebp"
elif [ -f "/opt/homebrew/bin/cwebp" ]; then
    CWEBP="/opt/homebrew/bin/cwebp"
else
    osascript -e 'display notification "cwebpがインストールされていません。Homebrewでインストールしてください: brew install webp" 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) ]]; then
        osascript -e "display notification \"${input_file}はサポートされていないファイル形式です。PNG、JPG、GIF、BMP、TIFFのみ対応しています。\" with title \"エラー\""
        continue
    fi

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

    # webpに変換
    "$CWEBP" -q 80 "$input_file" -o "$output_file"

    # 変換が成功したか確認
    if [ ! -f "$output_file" ] || [ ! -s "$output_file" ]; then
        osascript -e "display notification \"${input_file}のWebP変換に失敗しました\" 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 "WebP画像をDropoverに送信しました" with title "成功"'
    fi
else
    osascript -e 'display notification "変換に成功したファイルがありません" with title "エラー"'
fi
convert2webp.sh

Dropover

上の変換スクリプトを、 ~/Library/Application Scripts/me.damir.dropover-mac へ配置し、実行権限を付加

cd ~/Library/Application Scripts/me.damir.dropover-mac
chmod +x convert2webp.sh

Dropoverのsettingsを開き、Shelf Interaction 項目の Custom scriptsEditを押します

Image in a image block

+ボタンを押し、配置したシェルスクリプトを登録します

Image in a image block

最後に、settings → Instant Actions → Add New…にて登録したシェルスクリプトを追加します

Image in a image block

使い方

下図のようなJPEGファイルがDropoverのシェルフに入っているとしましょう

Image in a image block

これのシェルフ内の画像を右クリックし、All Actions → Convert2webp を選ぶと、変換が始まり変換されたWebP形式の画像に置き換わります。

Image in a image block

確認すると、webp画像がシェルフに入っていることが確認できました

Image in a image block

スクリプトでは、Dropoverからだけでなく、ターミナルからコマンドラインでも可能です

./convert2webp.sh input.jpg

まとめ

実は、Dropoverには、最初から画像変換の機能を持っています

Image in a image block

残念ながら、出力形式でWebPが対応していないので、今後対応されたら、今回の記事は不要になる事でしょう。

また、私の使い方ではクリップボードやCleanshotXから、一度も保存する事なくDropoverに持っていきたかったので、このような方法を試んでみました。

もっと、簡単・楽な方法があったら教えていただきたいです。