![Automator、ImageMagick、シェルスクリプトを使ってiPhoneのスクリーンショットやその他の写真を簡単につなぎ合わせる方法 [方法]](https://image.oligur.com/poclnokl/d1/b6/fig1.webp)
Automator、ImageMagick、シェルスクリプトを使ってiPhoneのスクリーンショットやその他の写真を簡単につなぎ合わせる方法 [方法]
- Oligur
- 0
- vyzf
本日のハウツーでは、コマンドライン画像操作ツール「ImageMagick」のインストール方法と、シェルスクリプトを使ってAutomatorシステムサービスを構築する方法をご紹介します。このサービスは、任意の枚数の写真を取り込み、それらすべてを含んだ1枚の縦長の写真を作成します。まるでテーブルの上に写真を並べたかのような仕上がりになりますが、テーブルは不要で、コンピューターを使うだけです。
驚くべきことに、それはすべて非常に簡単です。
信じられないかもしれませんが、2013年になっても、コマンドラインはコンピューターで様々なタスクを実行するのに最適なツールです。さらに驚くべきことに、これらのタスクの中には写真を扱うものもあります。まだ納得できない?それなら、一つお話しましょう。
Macで写真を扱う際に私が最もよく行うことの一つは、iPhoneやiPadでスクリーンショットを数枚撮って、それらを1枚の写真に合成することです。Cult of Macの記事では横向きの画像を使用していますが、iPhoneのスクリーンショットはほとんどの場合縦向きなので、3枚を並べて表示するのは理にかなっています。
問題は、これが面倒な作業になってしまうことです。私は通常、Acornで1枚の画像を開き、他の画像をその上にドラッグします(Acornは画像をレイヤーとして追加します)。次に、⌥⌘-c を押してキャンバスサイズを変更します(ヒント:ダイアログボックスの既存のピクセル数の後に *3 を追加すると、幅が3倍になります)。⌘-0 を押してビューのサイズを適切なサイズに変更し、3枚のスクリーンショットを手動でドラッグして整列させます。最後に、Web用に保存します。
それは本当に面倒なことだ。
そこで、ついに対策を講じることにしました。ImageMagickというコマンドラインツールは知っていました。これは、想像し得る限りのあらゆる方法で画像を操作できるツールです。また、Automatorを使ってシステムサービスを作成しています。これは、Finder(または他のアプリ)のプラグインで、ファイル、フォルダ、テキストに操作を加えるものです。
これらを組み合わせて、Finderで複数の写真を選択し、右クリックして1枚の写真に連結できるワークフローを作れるのではないかと考えました。おまけ:Cult of MacはJPG形式を必要とするため、入力形式(iOSのスクリーンショットの場合は通常PNG)に関係なく、プラグインでJPG形式を出力するようにします。
さあ行こう。
ImageMagickのインストール
MacPortsとHomebrew
まず、ImageMagickをインストールする必要があります。インストール方法はいくつかあります。自分でビルドしてインストールすることも、HomebrewやMacPortsなどのツールを使ってインストールすることもできます。私はMacPortsを使いました。Mountain Lion、Lion、Snow Leopard用の非常にシンプルなパッケージインストーラーがあるからです。注意点として、ImageMagickを使用するにはXcodeとそのコマンドラインツールがインストールされている必要がありますが、Homebrewの場合はターミナルにコードを1行貼り付けるだけで起動できます。
両方の手順は上記のリンクにあります。
イメージマジック
これでImageMagickをインストールできます。MacPortsを使って、以下を入力してください。
sudo port install ImageMagick
Homebrew を使用して ImageMagick をインストールするには、次のように入力します。
brew install ImageMagick
オートメーター
次に、Automatorワークフローを構築します。アプリを開き、このウィンドウから「サービス」を選択します(起動時にポップアップ表示されるはずです。表示されない場合、または既にAutomatorを操作している場合は、⌘-Nを押して新しいファイルを作成してください)。
ワークフローにいくつかステップを追加しましょう。「シェルスクリプトを実行」アクションを追加したいのですが、一番簡単な方法は、左側の列でこのアクションを検索し、右側の大きなキャンバスにドラッグすることです。
それでは、コマンドを追加しましょう。注意:Automatorがこのワークフローの先頭に「選択したFinder項目を取得」というコマンドを追加しようとした場合は、そのままにしておいてください。Automator内でワークフローをテストしたい場合は、自分で追加してください。ただし、ワークフローを保存する際には必ず削除してください。そうしないと、ワークフローが2回実行され、予期しない結果が生じる可能性があります。
まず、「入力を渡す」オプションの横にあるドロップダウンを「引数として渡す」に変更します。これでファイルがファイルとして渡されるようになります(少なくとも私はコーディングが得意ではないので、そうだと思います)。次に、実際のコマンドを貼り付けます。
ImageMagick コマンドの形式は次のとおりです。
$> convert +append a.png b.png c.jpg
「convert」の部分が今回使用するコマンドです。「+append」はImageMagickに画像を横に並べるように強制します(縦に並べるには削除します)。そして「a.png b.png c.jpg」は(少し分かりにくいですが)2つのソースファイルと1つの出力ファイルです。
Automatorが既に編集ボックスにコードを追加しているのがわかるでしょう。「do」という行の後に以下のコードを貼り付けるだけです。
/opt/local/bin/convert "$@" +append ~/Desktop/shot.jpg
あるいは、編集ボックスですべて選択して、全体を貼り付けることもできます。
for f in "$@"
do /opt/local/bin/convert "$@" +append ~/Desktop/shot.jpg
echo "$f"
done
ここで「convert」コマンドのフルパスを記載した点にご注意ください。インストール環境(Homebrew または MacPorts を使用)によっては、場所が異なる場合があります。このバージョンは MacPorts インストールで動作します。また、変換後のファイル(デスクトップ)へのパスとファイル名(shot.jpg)をハードコードしました。変更したいのはファイル名だけです。スクリプトに入力ファイルの名前を取得させ、それを変換後の JPG ファイルのルートとして使用する方法がわかりません。ご助力いただければ幸いです(メールまたは Twitter でのご回答をお待ちしております)。
Finderで画像をいくつか選択し、ワークフローを実行してテストしてみましょう(Automatorツールバーの大きな「実行」ボタンを使用)。注:Automator内でこの処理を実行するには、最初に「選択したFinder項目を取得」ステップを追加しておく必要があります。
うまくいったら、保存してください。適切な名前を付けてください(私は「Two Up」と名付けましたが、2枚だけでなく何枚でも保存できます)。これで、Finderで画像ファイルを右クリックすると、オプションとして表示されるはずです。
苦労して作った結果をCult of Macのチャットルームに貼り付けた途端、みんなが文句を言い始めたり、端に余白が欲しいとか、その他細かい要求をしてきたり。でも、ImageMagickを使えば、その全てが実現できます。
iPhoneから写真をインポートすると自動的にタイル表示してくれるのは、あまり好きではありませんでしたが、面白いアイデアだと思いました。そのためのImage Captureプラグインを作りました。
Image CaptureはMacに内蔵された優れたアプリで、iOSデバイスから写真をコピーしたり削除したり、スキャナーから画像をインポートしたりできます。また、インポート時に特定のルールやプラグインを適用するように設定することもできます。
プラグインを作るには、Automatorで新しいファイルを作成します。今回はドキュメントの種類として「Image Capture Plugin」を選択します。そして、最初のプロジェクトからワークフローのステップをコピー&ペーストするだけです。保存して名前を付ければ完了です。
MacにiOSデバイスを接続してImage Captureを起動すると、デバイス上で数枚の写真を選択してこのワークフローに送ることができます。ファイルはデスクトップに保存されますが、実際のファイルはインポートされず、iPhoneから削除されることもありません。
選択肢はほぼ無限大であることは明らかです。ImageMagickのコマンドライブラリを見れば、その強力さが分かります。しかも、Hazelのようなツールを使う前は、様々なトリガーに基づいてシェルスクリプトを自動実行できます。