ともさんのHP >プロブラミング >自作JavaLibrary >Javaで画像情報を読みこむ
JavaでJpg画像のGPS情報を取得する方法
デジカメで撮影されたJpeg形式のファイルにはシャッター速度、絞り値など、撮影時の情報がExifという形式で入っています。この情報をJavaを使って取り出す方法を紹介します。
オリンパスのGPS付きデジタルカメラ「OLYMPUS Tough TG-4」
デジカメを買い換えました。オリンパスの「OLYMPUS Tough TG-4」という機種です。
買い替えの一番の理由は、GPS付きで、位置情報が得られるからです。
LOG機能もあって、カメラを持って歩いた軌跡もたどることができます。
GPS楽天 つきの
カメラ
楽天 を用いて、グーグルマップに写真や歩いた軌跡を自動的に貼り付けるようにしたい、というのが購入の目的でした。
デジタルカメラの情報保存フォーマット
現在のデジタルカメラは、撮影すると、撮影時のいろいろな情報を画像ファイルに同梱するようになっています。
画像ファイルの形式はjpegというフォーマット形式ですが、この形式のコメント範囲に載せる形で入っています。
情報のフォーマットも決まっていて、Exif規格といいます。
入っている情報は一般的に、
撮影日時
、撮影機器メーカー名、撮影機器モデル名、画像全体の解像度、水平・垂直方向の単位あたり解像度
、撮影方向、シャッタースピード、絞り(F値)、ISO感度、測光モード、フラッシュの有無
、露光補正ステップ値、焦点距離、色空間(カラースペース)、GPS情報 - GPS付きカメラの場合、緯度・経度・標高など。
、サムネイル(160×120画素)
があります。
GPS付きデジタルカメラは個人情報流出に注意
画像ファイルに、いろいろな情報が添付されているので、撮影した画像をブログなどにアップする際は注意が必要です。
シャッター速度や絞り値などは出ても一向に問題ないのですが、GPS情報は撮影地の緯度経度がわかってしまいます。
自宅で撮影した画像をそのままアップすれば自宅の位置が第3者に知られてしまいます。Exifを削除してからアップするか、GPS機能をOFFにして撮影するよう、気をつけましょう。
私の場合は、
Java
楽天 を用いてオリジナルを縮小した画像ファイルを作成し、それをアップロードしています。画像情報は縮小時に消去されてます。
Javaを使ったデジカメ画像からのExif情報読み込み方法
いろいろ自分で試してみたのですが、うまく行かず。ネット上を探してみたら、ライブラリが見つかりました。
使ってみると簡単に取り出せてしまったので、その方法を書きます。
まずはライブラリのダウンロード。
こちら
からダウンロードさせてもらいます。有益な情報を提供していただいている方々には、いつも感謝しております。
解凍したjarファイルを所定のフォルダにおきます。
私の場合は、\jdk1.6.0_07\jre\lib\extホルダにおきました。
xmpcore.jar metadata-extractor-2.6.2.jarファイルが私のダウンロード時の最新ファイルです。
これで準備は完了。
読み込みの試験クラスを書いてみました。
画像情報読み込みのためのJavaクラスソース
package tomojavalib.test; import java.io.File; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.metadata.*; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataNode; import org.w3c.dom.NodeList; import com.drew.*; import com.drew.imaging.*; import com.drew.imaging.jpeg.JpegProcessingException; import com.drew.imaging.jpeg.JpegSegmentReader; import com.drew.lang.*; import com.drew.metadata.*; public class Test6{ public static void main(String[] args) throws ImageProcessingException, IOException { File jpegFile = new File("c:\\test.jpg"); Metadata metadata = ImageMetadataReader.readMetadata(jpegFile); for (Directory directory : metadata.getDirectories()) { for (Tag tag : directory.getTags()) { System.out.println(tag); } } } } |
このクラスを実行すると、下記のデータがドバーっと吐き出されます。
[Jpeg] Compression Type - Baseline [Jpeg] Data Precision - 8 bits [Jpeg] Image Height - 960 pixels [Jpeg] Image Width - 1280 pixels [Jpeg] Number of Components - 3 [Jpeg] Component 1 - Y component: Quantization table 0, Sampling factors 1 horiz/2 vert [Jpeg] Component 2 - Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert [Jpeg] Component 3 - Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert [Exif SubIFD] Exposure Time - 1/30 sec [Exif SubIFD] F-Number - F2 [Exif SubIFD] Exposure Program - Program normal [Exif SubIFD] ISO Speed Ratings - 640 [Exif SubIFD] Unknown tag (0x8830) - 1 [Exif SubIFD] Exif Version - 2.30 [Exif SubIFD] Date/Time Original - 2012:06:30 19:51:24 [Exif SubIFD] Date/Time Digitized - 2012:06:30 19:51:24 [Exif SubIFD] Components Configuration - YCbCr [Exif SubIFD] Exposure Bias Value - 0 EV [Exif SubIFD] Max Aperture Value - F2 [Exif SubIFD] Metering Mode - Multi-segment [Exif SubIFD] White Balance - Unknown [Exif SubIFD] Flash - Flash did not fire, auto [Exif SubIFD] Focal Length - 4.5 mm [Exif SubIFD] User Comment - [Exif SubIFD] FlashPix Version - 1.00 [Exif SubIFD] Color Space - sRGB [Exif SubIFD] Exif Image Width - 1280 pixels [Exif SubIFD] Exif Image Height - 960 pixels [Exif SubIFD] File Source - Digital Still Camera (DSC) [Exif SubIFD] Custom Rendered - Normal process [Exif SubIFD] Exposure Mode - Auto exposure [Exif SubIFD] White Balance Mode - Auto white balance [Exif SubIFD] Digital Zoom Ratio - 1 [Exif SubIFD] Focal Length 35 - 25mm [Exif SubIFD] Scene Capture Type - Standard [Exif SubIFD] Gain Control - Low gain down [Exif SubIFD] Contrast - None [Exif SubIFD] Saturation - None [Exif SubIFD] Sharpness - None [Exif IFD0] Image Description - OLYMPUS DIGITAL CAMERA [Exif IFD0] Make - OLYMPUS IMAGING CORP. [Exif IFD0] Model - TG-1 [Exif IFD0] Orientation - Top, left side (Horizontal / normal) [Exif IFD0] X Resolution - 160 dots per inch [Exif IFD0] Y Resolution - 160 dots per inch [Exif IFD0] Resolution Unit - Inch [Exif IFD0] Software - Version 1.0 [Exif IFD0] Date/Time - 2012:06:30 19:51:24 [Exif IFD0] Artist - [Exif IFD0] YCbCr Positioning - Datum point [Exif IFD0] Copyright - [Exif IFD0] Unknown tag (0xc4a5) - [528 bytes] [Interoperability] Interoperability Index - Recommended Exif Interoperability Rules (ExifR98) [Interoperability] Interoperability Version - 1.00 [GPS] GPS Version ID - 2.300 [GPS] GPS Latitude Ref - N [GPS] GPS Latitude - 32.0° 26.0' 45.85000000000723" [GPS] GPS Longitude Ref - E [GPS] GPS Longitude - 129.0° 16.0' 66.78199999991284" [GPS] GPS Status - Active (Measurement in progress) [GPS] GPS Img Direction Ref - Magnetic direction [GPS] GPS Img Direction - 200 degrees [GPS] GPS Area Information - [264 bytes] [Exif Thumbnail] Thumbnail Compression - JPEG (old-style) [Exif Thumbnail] X Resolution - 72 dots per inch [Exif Thumbnail] Y Resolution - 72 dots per inch [Exif Thumbnail] Resolution Unit - Inch [Exif Thumbnail] Thumbnail Offset - 13012 bytes [Exif Thumbnail] Thumbnail Length - 3869 bytes |
私が欲しかったGPS情報もしっかり入っていますね。
このデータを加工してあげれば、グーグルマップへの貼り付けもすぐにできそうです。
OutOfMemoryErrorが出た時の対応方法
さっそくこのライブラリを使ったクラスを作ったのですが、OutOfMemoryErrorがでてすぐに止まってしまいます。
どうやらこのライブラリ、たくさんメモリを使うようです。
そこで、1回使用したらこまめにオブジェクトの値にnullを入れ、ガベージコレクションSystem.gc();
を追記しましたが、それでもエラーが出てしまいます。
なので下記のように起動時にJAVAの使えるメモリーを80メガバイトに増やして実行してみました。これで正常に動くようになりました。
java -Xmx80m -jar SyasinSyori.jar
最終更新日: 2018-08-29 04:58:33
ともさんのHP >プロブラミング >自作JavaLibrary >Javaで画像情報を読みこむ
ツイート