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などから確認することもできますが、画像が大量に存在する場合、手間がかかりすぎます。ターミナルからバッチ処理できるように準備しておくのがおすすめです。