ブログに掲載したり、チャットで他人に送ったりする JPEG ファイルは自動的にリサイズや最適化がされないことが多いはずです。一方、昨今は携帯電話で簡易的に撮影した写真であっても JPEG ファイルになると優に1MBを超えます。これまでは JPEG の最適化スクリプトを呼び出して使っていましたが、日常使いのファイラからコンテキストメニューで呼び出したくなったので、対応することにしました。
Cinnamon デスクトップ環境の標準ファイラである Nemo の拡張メニューはアクションファイルと呼ばれる定義ファイルを ~/.local/share/nemo/actions
の配下に格納することにより追加できます。
Nemo のアクションファイル
アクションファイルの記述方法は、実際にコメント付きの内容を見た方が早いと思います。(コメントは Gemini の邦訳に依る)
[Nemo Action]
# このアクションがアクティブかどうか。トラブルシューティング用。
# 省略可能 - このフィールドが省略された場合、アクションはアクティブになります。
Active=true
# Name、Comment (ツールチップ)、Exec フィールドで使用できる標準トークン:
# %U - 選択した URI リストを挿入
# %F - 選択したパスリストを挿入
# %P - 親 (現在の) ディレクトリのパスを挿入
# %f または %N (非推奨) - 最初に選択したファイルの表示名を挿入
# %p - 親ディレクトリの表示名を挿入
# %D - ファイルのデバイスパスを挿入 (例: /dev/sdb1)
# %e - 拡張子を除いた、最初に選択したファイルの表示名を挿入
# %% - リテラルパーセント記号を挿入。次の文字をトークンとして扱わない
# %X - このアクションがアクティブ化されている NemoWindow の XID を挿入
# メニューに表示する名前。標準デスクトップ仕様でロケール対応。
# **** 必須 ****
Name=JPEGファイルを品質60で最適化
# ツールチップ。ロケール対応 (ステータスバーに表示)
Comment=JPEGファイルを品質60で最適化
# 実行する内容。< > で囲むと、actions フォルダにある実行可能ファイルを実行します。
# **** 必須 ****
Exec=jpegoptim -s -f -p -P -m60 %F
#Exec=<myaction.py -r -g %P %F %U>
# メニューで使用するアイコン名 - テーマアイコン名である必要があります。
# /usr/share/icons/Yaru/32x32/actions
Icon-Name=mail-send-receive
# アイコンに使用する Gtk Stock ID。
# Icon-name と Stock-Id の両方が定義されている場合、Stock-Id が優先されます。
#Stock-Id=gtk-cdrom
# 選択タイプ: [s]ingle (単数)、[m]ultiple (複数)、any (すべて)、
# notnone (少なくとも1つ)、none (背景クリック)、または
# 表示するために選択する必要があるファイルの数を表す数値。
# ****** 必須 *******
Selection=notnone
# 表示する拡張子 - これは配列です。セミコロンで終わります。
# セミコロンで終わる単一エントリオプション:
# "dir" (ディレクトリ選択)
# "none" (拡張子なし)
# "nodirs" (ディレクトリを含まないすべての選択)
# "any" (ディレクトリを含むすべてのファイルタイプ)
# 個々の特定の拡張子は、セミコロンで区切られたリストにすることができます。
# 拡張子は大文字と小文字を区別しません。jpg は JPG、jPg、jpg などに一致します。
# **** 拡張子またはMIMETYPEのいずれかが必須 *****
Extensions=jpg;jpeg;
# 表示する mime-type - これは配列です。セミコロンで終わります。
# **** 拡張子またはMIMETYPEのいずれかが必須 *****
#Mimetypes=text/plain;
# 使用する区切り文字 (ある場合) - exec 行のパス/URLエントリ間に挿入する文字列を追加します。
# 省略可能 - これを省略すると、スペースが挿入されます。
# ここに末尾のスペースを含めることができます。
#Separator=,
# 使用する引用符の種類 (ある場合) - パス/URLを引用符で囲みます。
# 省略可能 - デフォルトでは引用符は付きません。
# 指定できるのは: single (単引用符)、double (二重引用符)、backtick (バッククォート)
#Quote=double
# 依存関係 - このアクションが機能するために必要なプログラム実行可能ファイル。Nemo は
# これらのプログラムをパス内で検索し、いずれかが欠落している場合はアクションを表示しません。
# パス内の実行可能ファイルの代わりに、またはそれに加えて、チェックするファイルへの
# 絶対パス (例: /usr/lib/gvfs/gvfsd-archive) を指定することもできます。
# これは配列で、エントリをセミコロンで区切り、セミコロンで終了します。
#
# v3.0: 反転依存関係: プログラムの前に '!' を付けるとロジックが反転します
# - プログラムが存在する場合、チェックは失敗します。
#Dependencies=xed;!gedit;
# 条件 - セミコロンで区切られた特別な条件の配列:
# "desktop" (現在の (親) フォルダがデスクトップ)
# "removable" (ターゲット (最初の選択) がリムーバブル)
# "gsettings <schema> <boolean key>" (真)
# "gsettings <schema> <key> <key-type> <[eq|ne|gt|lt]> <value>"
# "dbus <name>" (存在する)
# "exec <program>" (プログラムを実行し、その終了コードを確認 (0 は成功、0 以外は失敗))。
# プログラムがアクションのフォルダにある場合は < > で囲みます。
#Conditions=desktop;
# スペースのエスケープ - ファイル名と URI ($U, $F, $P, $D) のスペースをエスケープするために
# true に設定します。
# 引用符で囲む必要がある生のファイル名を取得するよりも、こちらの方が好ましい場合があります。
# 省略可能 - デフォルトでは false
EscapeSpaces=true
# ターミナルで実行 - 生成されたターミナルウィンドウで Exec 行を実行するために true に設定します。
# 通常、これを使用する場合は、Quotes を定義しないでください。これは、展開されたコマンド文字列を
# 引数ベクトルに変換する際に処理されるためです。
# 省略可能 - デフォルトでは false
#Terminal=false
# Uri スキーム - 現在の場所のスキームが一致する必要がある uri スキームを提供します。
# 例:
# ...
# UriScheme=sftp
# ...
# sftp://joe@10.0.0.200/ は一致します。
# file:///home/joe/.bashrc は一致しません。
#UriScheme=file
Name
はコンテキストメニューに表示される文字列、Icon-Name
は /usr/share/icons/<お使いのテーマ名>
以下にあるアイコンファイルの名前を拡張子を除いて指定してあげればいいようです。
Selection
は、ファイラ上でどのように選択した場合にメニュー項目を出すのかを指定します。Extensions
は言わずもがな、メニュー項目を出したい対象ファイルの拡張子の指定ですね。
アクションファイルのファイル名は、拡張子を nemo_action
にしていれば自由なようです。ただし、メニュー項目が複数表示される場合の並び順はアクションファイルの名前順になるみたいです。
アクションファイルを actions ディレクトリに追加したら、Nemo を再起動することもなく即時適用されます。
JPEG ファイルを品質60で最適化する
上の内容のコメント以外を抜き出すと次になります。
[Nemo Action]
Name=JPEGファイルを品質60で最適化
Comment=JPEGファイルを品質60で最適化
Exec=jpegoptim -s -f -p -P -m60 %F
Icon-Name=mail-send-receive
Selection=notnone
Extensions=jpg;jpeg;
EscapeSpaces=true
Exec の部分に実際に呼び出すコマンドを記述します。JPEG の最適化には jpegtran だか mozjpeg だかを使っていましたが、ここ数年でも変化しているようでなかなか追えていません。Google も出しているみたいですね。現在の僕は、今の仕事環境を構築した際、Ubuntu の公式リポジトリにあった jpegoptim を使っているようです。長年微調整しながら使ってたスクリプトなので実際に何を叩いているかは記憶が曖昧でした。
その他の便利なアクションファイル
ついでなので、画像ファイルを扱う際に便利なコマンドを拡張メニューに追加しておきました。
画像を横1280pxでリサイズする
[Nemo Action]
Name=画像ファイルを横1280pxにリサイズ
Comment=画像ファイルを横1280pxにリサイズ
Exec=mogrify -resize 1280x %F
Icon-Name=mail-send-receive
Selection=notnone
Extensions=jpg;jpeg;jpe;png;gif;webp;
EscapeSpaces=true
PNG, GIF, Webp を JPEG 化する
[Nemo Action]
Name=画像ファイルを品質80でJPEG化
Comment=画像ファイルを品質80でJPEG化
Exec=convert -quality 80 %F %F.jpg
Icon-Name=mail-send-receive
Selection=notnone
Extensions=png;gif;webp;
EscapeSpaces=true
品質60、品質40のアクションファイルを追加しておくとさらに便利。
PDF を JPEG 化する
[Nemo Action]
Name=PDFファイルをJPEG化
Comment=PDFファイルをJPEG化
Exec=pdftoppm -r 144 -jpeg "%F" "%F"
Icon-Name=mail-send-receive
Selection=notnone
Extensions=pdf;
EscapeSpaces=true
PDF でもらった資料をフォトアルバム化して管理する時に便利。