写真ファイルのExif書き込み

425 views
Skip to first unread message

TJ

unread,
Oct 23, 2015, 4:02:59 AM10/23/15
to FMEユーザーフォーラム
写真ファイル(JPEG形式)のExif情報を修正したいと思います。

FME 2015.1.2.1で試しました。
JPEGリーダはExif関連属性を公開できますが、JPEGライダーはそれらの属性持っていないようで、結果的にJPEGライダーから出力した画像のExifが全て削除されることになります。

JPEGライダーはExifの書き込みに対応していないのでしょうか?
FMEで他のExifを修正する方法がありますでしょうか?

Takashi Iijima

unread,
Oct 23, 2015, 4:25:34 AM10/23/15
to FMEユーザーフォーラム
残念ながらFMEのライターはEXIFをサポートしていません。
Communityでもしばしば話題になっているので、おそらくリクエストはあるのだと思いますが、2016 beta でもまだ未対応のようです。
現時点では、JPEGリーダーで読み込んだEXIF情報を他のフォーマットのファイルに保存するか、あるいは、FME以外のツールを探すしかありません。

TJ

unread,
Oct 23, 2015, 6:41:25 AM10/23/15
to FMEユーザーフォーラム
元々Exif編集ツール「F6 Exif」を使用していました。FMEでもできないかなと試してできなかったので質問をしました。

残念ですが、FMEを使ってF6 Exifの書き込み用CSVをカスタマイズできるので、それだけでもだいぶ楽になります。今回FMEとF6 Exifを併用することにします。

ありがとうございました。

Takashi Iijima

unread,
Oct 23, 2015, 9:14:48 PM10/23/15
to FMEユーザーフォーラム
Safe社に問い合わせたところ、現時点でスケジュールは決まっていないが、拡張すべき事項としてはすでに登録されているとのことでした。

TJ

unread,
Oct 24, 2015, 9:02:43 AM10/24/15
to FMEユーザーフォーラム
問い合わせをしていただいてありがとうございました。

正式実装を楽しみにしています。
知識がないから分かりませんが、PythonCallerでExifを書き込む機能だけPythonのサードパーティライブラリを呼び出して、写真にExif情報を書き込むことが可能でしょうか。

Takashi Iijima

unread,
Oct 24, 2015, 9:22:28 AM10/24/15
to FMEユーザーフォーラム
経験はありませんが、PILライブラリを使って、既存のJPEGファイルを読み込み、Exifを設定して保存し直すことはできると思います。
FMEにPILをインストールすれば、
・ExifなしのJPEGファイルと、それに設定すべきExif情報を適当なフォーマット(例えばCSVなど)で出力するワークスペースを作成し、
・別のワークスペースで、WorkspaceRunnerによってそれを実行し、PythonCallerでExifを付加したJPEGに保存し直す、
ということができそうです

FME 2016 ならば、FeatureWriter を使ってもう少し簡素化できるかも知れません。
次の記事では、ラスターではありませんが、FeatureWriter で保存したファイルに同じワークスペース内でアクセスするという意味で似たような例を取り上げました。

TJ

unread,
Oct 25, 2015, 12:50:14 PM10/25/15
to FMEユーザーフォーラム
いろいろ教えていただいてありがとうございます。

PILライブラリは読み込みのみ対応しているようで、代わりにpyexiv2ライブラリを使ってみました。
PythonCreatorのPython Script:
import fmeobjects
import pyexiv2
import math
from datetime import datetime as dt
from fractions import Fraction


def dms_to_decimal(listdms):
    sum
=0.0
   
for idx,item in enumerate(listdms):
        sum
+=item/(math.pow(60,idx))
   
return sum


class FeatureCreator(object):
   
def __init__(self):
       
pass
   
def close(self):
        f
=r"H:\IMG_0295.jpg"
        metadata
=pyexiv2.ImageMetadata(f)
        metadata
.read()


       
ShootingDT=metadata["Exif.Photo.DateTimeDigitized"]
        latitude
=metadata["Exif.GPSInfo.GPSLatitude"]
        longitude
=metadata["Exif.GPSInfo.GPSLongitude"]


        feature
= fmeobjects.FMEFeature()
        feature
.setAttribute("ShootingDateTime",ShootingDT.value.strftime("%Y/%m/%d %H:%M:%S"))
        feature
.setAttribute("latitude",dms_to_decimal(latitude.value))
        feature
.setAttribute("longitude",dms_to_decimal(longitude.value))
       
        newDTStr
=dt.strptime("2015/10/26 12:30:34","%Y/%m/%d %H:%M:%S")
       
ShootingDT.value=newDTStr
        metadata
['Exif.Image.DateTime'].value=newDTStr
        metadata
['Exif.Photo.DateTimeOriginal'].value=newDTStr
        latitude
.value=[Fraction(36, 1), Fraction(14, 1), Fraction(217, 50)]
        longitude
.value=[Fraction(136, 1), Fraction(3, 1), Fraction(113, 50)]
        metadata
.write()


        metadata
.read()
       
ShootingDT_New=metadata["Exif.Photo.DateTimeDigitized"]
        latitude_New
=metadata["Exif.GPSInfo.GPSLatitude"]
        longitude_New
=metadata["Exif.GPSInfo.GPSLongitude"]
       
        feature
.setAttribute("ShootingDateTime_New",ShootingDT_New.value.strftime("%Y/%m/%d %H:%M:%S"))
        feature
.setAttribute("latitude_New",dms_to_decimal(latitude_New.value))
        feature
.setAttribute("longitude_New",dms_to_decimal(longitude_New.value))


       
self.pyoutput(feature)


Attributes to Expose: [ShootingDateTime],[latitude],[longitude],[ShootingDateTime_New],[latitude_New],[longitude_New]

実行後、ShootingDateTime latitude longitude ShootingDateTime_New latitude_New longitude_Newの各属性で変更前後の値を確認できます。

CSVファイルを読み込んで、PythonCreatorの代わりに、PythonCallerを使えば、各CSVの行に対して処理は可能だと思います。

このような場合、確かにFeatureWriterを使うと簡素化できると思います。
本来の使い方と違うかもしれませんが、FeatureWriterを使って、以前ここで質問をしていた元のShapeファイルを上書きすることもサポートされるのでしょうか?


Takashi Iijima

unread,
Oct 25, 2015, 9:31:46 PM10/25/15
to FMEユーザーフォーラム
フィードバックありがとうございます。pyxiv2、今度試してみます。

> FeatureWriterを使って、以前ここで質問をしていた元のShapeファイルを上書きすることもサポートされるのでしょうか?

FeatureWriter で変換結果を一旦新しいファイルに出力した後、同じワークスペース内で File Copy ライターを使って元のファイルの場所にコピーまたは移動して上書きできるようになると思います。
従来は Shutdown スクリプト、または、WorkspaceRunner を持つ別のワークスペースで行っていたことですが、"FeatureWriter + File Copy ライター" という選択肢がひとつ増えることになります。
これも FeatureWriter の活用事例のひとつになると思います。
Reply all
Reply to author
Forward
0 new messages