JPEG画像に位置情報が保存されていないか一括確認する方法

[PR]記事内のアフィリエイトリンクから収入を得る場合があります
  • URLをコピーしました!

S 20231226 114546

JPEG画像には位置情報を含めたさまざまな情報をEXIF情報として保存することができます。

写真を撮影した場所や、撮影時のカメラの設定などを確認することができる便利な機能ですが、位置情報が埋め込まれたままの写真をインターネットに公開してしまうと、公開した写真を元に自宅や職場の場所がばれてしまう危険性があります。

今回は位置情報がJPEG画像に埋め込まれていないかどうかを一括確認する方法を説明します。

目次

jheadコマンドを利用

JPEGのEXIF情報を確認したり削除したりすることができるjheadコマンドを利用します。jheadコマンドは各種パッケージ管理ツール(macOSの場合HomebrewやMacPorts)を利用してインストールすることができます。

jheadは「jhead 画像ファイル.jpg」と実行することでEXIF情報を表示します。

$ jhead DSCN0010.jpg
File name    : DSCN0010.jpg
File size    : 161713 bytes
File date    : 2022:11:09 15:15:17
Camera make  : NIKON
Camera model : COOLPIX P6000
Date/Time    : 2008:10:22 16:28:39
Resolution   : 640 x 480
Flash used   : No
Focal length : 24.0mm  (35mm equivalent: 112mm)
Exposure time: 0.013 s  (1/75)
Aperture     : f/5.9
ISO equiv.   : 64
Whitebalance : Auto
Metering Mode: pattern
Exposure     : program (auto)
GPS Latitude : N 43d 28m  2.814000s
GPS Longitude: E 11d 53m  6.456000s
GPS Altitude :
JPEG Quality : 84

結果に「GPS Latitude」や「GPS Longitude」が含まれていると位置情報が含まれていることになります。

jheadはワイルドカードを指定して複数のファイルを一括処理することができますが(jhead *.jpg等)、そのままでは位置情報が含まれているのかどうか確認するのに不便です。

そこでjheadをラップするシンプルなRubyスクリプトを作成してみました(エラーチェックなど省いている簡易的なものです。改造して使いやすくすることをおすすめします)。

require 'find'

class ExifChecker
  def initialize
    @printall = false
  end

  def check(path)
    Find.find(path) do |f|
      if f =~ /\.(jpg|jpeg)$/i
        msg = "OK"
        result = `jhead '#{f}'`
        begin
          result.each_line do |line|
            if line =~ /^GPS Latitude/ || line =~ /^GPS Longitude/
              msg = "NG: #{line}"
            end
          end
        rescue => e
          puts e.message
        end
        if @printall || msg =~ /^NG/
          puts "#{f} #{msg}"
        end
      end
    end
  end

end

exif = ExifChecker.new
exif.check(ARGV[0])

指定されたフォルダを再帰的にたどり、見つかったJPEG画像ファイルに位置情報が存在すればファイル名を表示するというものです。

exifchecker.rbとして保存し「ruby exifchecker.rb 画像フォルダ」と実行します。今回テスト用にGitHubで公開されているExif Samplesを使用しました。

$ ruby exifchecker.rb ~/evaluate/exif-samples
/Users/sora/evaluate/exif-samples/jpg/Canon_40D.jpg NG: GPS Longitude: ? ?
/Users/sora/evaluate/exif-samples/jpg/Kodak_CX7530.jpg NG: GPS Longitude: E 36d  3.385m  0s
Header missing JFIF marker
Header missing JFIF marker
Header missing JFIF marker
/Users/sora/evaluate/exif-samples/jpg/gps/DSCN0010.jpg NG: GPS Longitude: E 11d 53m  6.456000s
/Users/sora/evaluate/exif-samples/jpg/gps/DSCN0012.jpg NG: GPS Longitude: E 11d 53m  7.422000s
/Users/sora/evaluate/exif-samples/jpg/gps/DSCN0021.jpg NG: GPS Longitude: E 11d 53m  4.338000s
/Users/sora/evaluate/exif-samples/jpg/gps/DSCN0025.jpg NG: GPS Longitude: E 11d 52m 53.886000s
/Users/sora/evaluate/exif-samples/jpg/gps/DSCN0027.jpg NG: GPS Longitude: E 11d 52m 53.454000s
/Users/sora/evaluate/exif-samples/jpg/gps/DSCN0029.jpg NG: GPS Longitude: E 11d 52m 48.618000s
/Users/sora/evaluate/exif-samples/jpg/gps/DSCN0038.jpg NG: GPS Longitude: E 11d 52m 45.168000s
/Users/sora/evaluate/exif-samples/jpg/gps/DSCN0040.jpg NG: GPS Longitude: E 11d 52m 44.802000s
/Users/sora/evaluate/exif-samples/jpg/gps/DSCN0042.jpg NG: GPS Longitude: E 11d 52m 53.322s
/Users/sora/evaluate/exif-samples/jpg/hdr/canon_hdr_NO.jpg NG: GPS Longitude: ? ?
/Users/sora/evaluate/exif-samples/jpg/hdr/canon_hdr_YES.jpg NG: GPS Longitude: ? ?
/Users/sora/evaluate/exif-samples/jpg/hdr/iphone_hdr_NO.jpg NG: GPS Longitude: W  3d 43m 29.11s
/Users/sora/evaluate/exif-samples/jpg/hdr/iphone_hdr_YES.jpg NG: GPS Longitude: W  3d 43m 29.11s

Nonfatal Error : '/Users/sora/evaluate/exif-samples/jpg/tests/30-type_error.jpg' Illegal Exif or interop ofset directory link
/Users/sora/evaluate/exif-samples/jpg/tests/32-lens_data.jpeg NG: GPS Longitude: ? ?
/Users/sora/evaluate/exif-samples/jpg/tests/45-gps_ifd.jpg NG: GPS Longitude: ? ?
/Users/sora/evaluate/exif-samples/jpg/tests/46_UnicodeEncodeError.jpg NG: GPS Longitude: W  0d 40.4137m  0s
/Users/sora/evaluate/exif-samples/jpg/tests/67-0_length_string.jpg NG: GPS Longitude: E  7d 35m 31.00s

Nonfatal Error : '/Users/sora/evaluate/exif-samples/jpg/tests/87_OSError.jpg' Suspicious offset of first Exif IFD value
/Users/sora/evaluate/exif-samples/jpg/tests/87_OSError.jpg NG: GPS Longitude: E 11d 14.077166m  0s

エラーがでている画像ファイルもありますが、/jpg/gps以下の位置情報が埋め込まれているであろう画像ファイルを検出できていることがわかります。

なお、jheadで位置情報を削除することもでき、その場合"-purejpg"オプションをつけて、「jhead -purejpg DSCN0010.jpg」のように実行します。

まとめ

JPEG画像に位置情報が保存されていないか一括確認する方法を説明しました。EXIF情報はMacのFinderなどから確認することもできますが、画像が大量に存在する場合、手間がかかりすぎます。ターミナルからバッチ処理できるように準備しておくのがおすすめです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次