本サイトはアフィリエイト等の広告を利用しています

画像に外枠を付けるスクリプトの件の続き

前回の画像に外枠・縁取りを付ける、外周に枠線を引くの続きです。

気になること

その前回に書いた通りありがたくスクリプトを使わせていただいてます。環境はmacOS Sequoia 15.3.1です。
ただ、ちょっと気になる点が出てきてしまいました。

【問題】バックアップが新しい名前になり、元ファイルは同名のまま改変保存されること

これはTerminalとかコマンドラインの世界の流儀としては問題ないのかもしれないです。しかし、俺としては外枠を描いた画像は新しい名前で保存されて欲しいし、バックアップは元の名前のままがいいのですよ。現在あるファイルはそのままに、編集後は「名前をつけて保存」しておきたいということなのです。古くから染み付いた習性、Cmd + Shift + Sですわ。最近では「名前をつけて保存」じゃなくて「複製」になってきててそれはそれで微妙な違和感はあるんだけれど考え方としては同じです。

【問題】バックアップのファイルの拡張子が機能しなくなること

追加された「.bak」によって拡張子が変更されることとなりアイコンが変わってしまったりWクリックで開けなくなったりします。これもなんとかなるといいな…。

ということで調べてみました。
結論から言うと下記のコードでいけました。

解決策

--- Setting ---
property addStr : "_b"
------------------


use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

on open droppedFiles
	repeat with aFile in droppedFiles
		set filePath to POSIX path of aFile
		set pathString to (current application's NSString's stringWithString:filePath)
		set ext to (pathString's pathExtension()) as string --dotなし
		set baseFileName to (pathString's stringByDeletingPathExtension()) as string
		set newPath to baseFileName & addStr & "." & ext
		
		do shell script "cp " & quoted form of filePath & " " & quoted form of newPath
		-- Add a 1px gray border using ImageMagick
		do shell script "/opt/homebrew/bin/convert " & quoted form of filePath & " -bordercolor '#696969' -border 1x1 " & quoted form of newPath
	end repeat
end open
AppleScript

ただし、遅いです…!

余談

以下、調べた過程や寄り道の話です。

まず元ファイルの拡張子を取得したいので「Applescript 拡張子 取得」あたりでググってみて「指定ファイルの拡張子を取得する – AppleScriptの穴」を発見。2018年の記事ですがもちろん現在でも通用します。

AppleScriptで扱うファイルパスはなんだかややこしくて分かりづらいのですけど、スクリプト内でファイルのフルパスを文字列として取得しているので、その最後のドットから末尾までを拡張子として取得するのがいいのかなと自分では思ってました。しかしもっとスマートな方法が書かれてました。

FinderやSystem Eventsの機能を用いて拡張子を取得するのが一番手軽ではあるのですが、macOS 10.14以降の環境ではこの程度でもアプリケーションの機能を呼び出すと認証ダイアログが(初回のみですが)表示されます。Cocoaの機能呼び出しが手軽にできるので、些細な処理でもよく呼び出して使っています(個人的に)。

ふむふむ…って、「Cocoaの機能呼び出し」って何? AppleScriptにそんな機能あったっけ??

AppleScript名:指定ファイルの拡張子を取得する

use AppleScript version “2.4”
use scripting additions
use framework “Foundation”

set a to choose file
set aPath to POSIX path of a
set pathString to current application’s NSString’s stringWithString:aPath
set newPath to (pathString’s pathExtension()) as string
–>  ”jpg”

「NSString」「stringWithString」「pathExtension」とか自分的には懐かしい…。

つい書籍を探してしまった…。

で、こういうの出来たんだっけ?と確認すると、スクリプトエディタではmacOS 10.10(Yosemite 青白タンクじゃないよOSだよ)からできたとのこと。WikipediaによるとYosemiteのリリースは2014年10月17日。うむ〜、10年以上前か…。

この機能はAppleScriptObjC(ASOC)というらしいです。XCodeにAppleScriptで書けたのはなんとなく覚えているけどあれが原型だったらしいですね。Wikipediaの「AppleScript」内のAppleScriptObjC構文が概要について結構詳しかったです。正直に言うと忘れてたのか知らなかったのかもわからなくなってますが、この機能はいいです。
ただし、体感できるぐらいもたつきますね。スクリプトの短さを優先した結果だと前向きに行きます。あと、画像以外をドロップすると改変後の名前のファイルは作成されるのに中身はただのコピーですし、エラーも出ます。原則的に自分で使うものですから、これはいいでしょう。

対策するなら拡張子のリストを持っておいてドロップされたファイルが含まれるのかをチェックする、とかなんでしょうか。

あと、ASOCの正規表現を使う方法もあるようです。

また、ImageMagickでなくてsipsを使ったらどうかという話もありますが、元記事の画像に枠線を付けるプログラムをマックで作るでも書かれている通り、作者さんの環境では

日本語ファイル名を扱えない

ことで断念されたようです。
自分の環境(macOS Sequoia 15.3.1)ではこの問題は確認されませんでしたが、sips 画像編集のコマンド – DigitalBooを拝見するに過去にはかなり微妙なバージョンもあったようで、そのあたりも考慮するとImageMagickを使用するメリットのほうが上回るかもしれないなと感じてます。

sipsについての参考情報もリストアップしておきます。

以上です。

コメント