ImageMagick+Rubyでファイル名の情報を写真に入れる
良い写真が撮れたら、後で見れるように保存するだろう。
それを数年後に見たときにどこで撮ったか思い出せるだろうか。
写真を撮影したGPS座標や日付などから辿ることもできるが、アルバムのように写真内に日付や場所などメモを入れたいことはある。
今回は写真のファイル名を写真内に埋め込むサンプルを紹介する。
ここでは下記の画像のように右下にファイル名の情報を表示する(ファイル名: 江の島サムエル・コッキング苑_神奈川・藤沢_2020.jpg)。写真をクリックして拡大して見るとわかりやすい。
使うのは一般的に使われているImageMagick。
ファイル名の取得なりフォントサイズの計算なりはRubyで行うことにした。
rmagickを使えよと言われるかもしれないが、あれは環境構築が結構面倒くさいので、今回は高度なことはしないので、convertコマンドを直に叩くRubyスクリプトを作った。
早速だがコードを置いておく。(実行は自己責任で。実行前に念のために画像のバックアップを取っておいたほうが良いだろう。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# ファイル名に合わせたタイトルを埋め込む # ImageMagickのインストールが必要 require "fileutils" FONT_COLOR="white" files=Dir::glob("./**/*").map{|f| f.encode("utf-8")}.select{|f| File.extname(f)==".jpg"||File.extname(f)==".jpeg"||File.extname(f)==".JPG"||File.extname(f)==".JPEG"} puts("#{files.size} images are detected.") not_process_list=[] system("mkdir -p output") files.each_with_index do |img,i| print("\rprocessing image: #{i+1}/#{files.size}") value=File.basename(img).split("_") if value.size==3 then str=`identify -verbose \"#{img}\" | grep exif:ExifImageLength:` h=str.split(":")[2] if h&&h.to_i!=0 then point=(0.018*h.to_i).ceil cmd="convert \"#{img}\" -font sazanami-gothic.ttf -fill #{FONT_COLOR} -gravity SouthEast -pointsize #{point} -annotate 0 \"#{value[0]} (#{value[1]}) #{value[2]} \" \"output/#{File.basename(img)}\"" unless system(cmd) then not_process_list.push(img) end else not_process_list.push(img) end else not_process_list.push(img) end end puts("\n#{files.size-not_process_list.size} images are edited.") puts("\nfinished. following #{not_process_list.size} files are not edited:") puts(not_process_list.join(',')) |
やっていることだが、
①カレントディレクトリ以下のすべてのjpegファイルをピックアップ
②「A_B_C.jpg」の方式の名前ファイルのみをリストに追加(以下、リストに追加された画像全てに行われる)
③各画像ファイルに対して画像の大きさ(ピクセル数)を取得してそれに合わせて埋め込む文字のサイズを計算(解像度の高い画像ほど大きな文字サイズにすることで見た目上どの大きさの画像でも同じ大きさの文字に見えるようにしている)
④ファイル名をパースして計算した大きさの文字を画像右下に埋め込む
ここで、「A_B_C.jpg」のAは地名, Bは所在地, Cは日付が来ることを期待しており、例えば「江の島サムエル・コッキング苑_神奈川・藤沢_2020.jpg」の入力に対して「江の島サムエル・コッキング苑(神奈川・藤沢) 2020」と写真に印字される。
なお、③において、identifyコマンドで画像の解像度を取得しており、面倒くさいのでidentifyコマンドの出力をgrepして使っているという雑な作りになっているので、grepが使えない環境(Wndowsなど)では固定値にするか他の方法で実現する必要がある。同様にmakedirコマンドも面倒くさいので直打ちであるので必要に応じて変更を行う。
実行すると、カレントディレクトリ以下のJPEGファイルで「A_B_C.jpg」の方式の名前ファイルに対してそれに合わせた文字を埋め込んだ画像をoutputディレクトリに出力する。
なお、日本語を表示する場合は日本語フォントを指定する必要があり、上記ではカレントディレクトリ内の「sazanami-gothic.ttf」を指定している。
これを環境に合わせて正しく指定する必要があるので注意。
なお、肝となっているconvertコマンドでの文字入れであるが、こちらはWeb上に腐るほど情報が転がっているのでここで細かい説明は割愛するが
「convert “入力ファイル名” -font フォント名 -fill フォントカラー -gravity 位置 -pointsize フォントサイズ -annotate 向き “埋め込む文字列” “出力先”」で指定する。
好きなように適当に改造して使ってほしい。
同じカテゴリー(技術メモ)の他の記事を表示
全記事を表示
タグ: Ruby
コメント (3)
コメント失礼します。
「強化学習(Q学習)のデモプログラム」というブログから来させていただきました。
私は現在大学でProfit Sharingを用いた研究をしているのですが、ネット上でいろいろ探してみているものの参考にできる情報が少ないためプログラムを書くのに苦戦している状態です。
実際にプログラムを作成されたブログ主さんに作る際のアドバイスやこんなサイトなどを参考にしたなどあればご享受いただけると幸いです。
コメントありがとうございます。確かに日本語での情報はあまり多くないですよね。
私は当時「マルチエージェント学習―相互作用の謎に迫る」という書籍を参考に勉強していました。
https://amzn.to/3VFRU0l
アルゴリズムなども書かれていて実装に役に立った記憶です。
中古だとそんなに高くないですし、図書館などにもあるかもしれませんので是非参考にしてみてください。
返信ありがとうございます。
教えていただいた書籍参考にさせていただいて頑張ってみます!
ご丁寧な対応有り難うございます!