【Ruby】写真ファイルの場所情報を取得する【多すぎる写真を整理したい】

デジカメ時代、写真データは大量になりがち

シャッフルして抽出した写真を見る楽しさ

アルバムってみるの楽しいですよね。

適量ならね!

そう。

デジカメなので、撮るのは簡単。

でも、選ぶの大変。

過去10年撮りためたデータは500GBくらいになってます。

プログラムにシャッフルチョイスさせる

そんなわけで、過去の写真をYYMMフォルダに整理し、そこからランダムにn枚チョイスするプログラムを作ったりしていました。

mhaya18.hatenablog.com

こうすると、過去をざーっと見返すことが出来て楽しいわけです。

YYMMごとにn枚なので、年月のバランスは良いんですけど、

完全にランダムにチョイスしているので、ちょっと偏ったりもします。

なので、場所の要素も追加して、チョイスするバランスを取ったらどうかと考えました。

場所情報の取得方法

環境

  • Windows10
  • Ruby 2.6.5
  • exifr (1.3.6)

やり方

exifrというgemをインストールします。

使い方の詳細はこちらを参照。

github.com

ディズニーランドに行った時の写真で試してみる

ソースコード

require 'exifr/jpeg'

Dir.glob('*.jpg').each do |f|

    ex = EXIFR::JPEG.new(f)
    p ex.exif?
    p ex.gps_latitude
    p ex.gps_longitude

end

結果

>ruby test.rb
true
[(35/1), (38/1), (897/100)]
[(139/1), (52/1), (4331/100)]

たしかこの辺で撮ったはず。

f:id:mhaya18:20200101081856p:plain

【Ruby】ディレクトリからランダムにn枚写真をチョイス【写真整理】

写真を年月ごとに整理

以下の記事で過去の写真を年月フォルダに整理しました。

mhaya18.hatenablog.com

次にやりたいのは、各フォルダからランダムに数枚チョイスすることです。

過去の写真からランダムに抽出

過去の写真から自分の意思とは関係なくチョイスする。

それを見る。

楽しそうでしょ。

ソースコード

require 'fileutils'

#-------------------------------------------------
# フォルダごとにn枚選ぶ
#-------------------------------------------------

cur = Dir.pwd + '/'
dir_arr = Array.new
file_arr = Array.new

# フォルダを作成
if !Dir.exist?('select')
  Dir.mkdir('select')
end

# フォルダごとに取得するファイル数
if ARGV[0] == nil
  n = 3
else
  n = ARGV[0].to_i
end

# ディレクトリ一覧を作成
# カレント以下を再帰的に処理
Dir.glob('./**/*').each do |f|
  if FileTest.directory? f
    if f == './select'
    else
      dir_arr << f
    end
  end
end

# ディレクトリ分ループ
dir_arr.each { |d|
  file_arr.clear
  # ディレクトリごとの画像ファイル一覧作成
  Dir.glob(d + '/*').each do |f|
   ext = File.extname(f) # 拡張子取得
   if ext == '.JPG' || ext == '.jpg' || ext == '.JPEG' || ext == '.jpeg'
     file_arr << f
   end
  end

  ln = file_arr.length
  if ln == 0
  else
    file_arr.sample(n).each do |f|
      new_name = cur + '/select/' + File.basename(f)
      FileUtils.cp(f, new_name)
    end
  end
}