                                                        2020.06.23
==================================================================
【ソ フ ト名】　PosiAdder
【バージョン】　Version 0.2
【登　録　名】　PosiAdder.zip
【作　　　者】　flyman (flymanアットマークkestrel.jp)
【動作環境　】　Windows10
【配布　　　】　フリーウェア
==================================================================

[PosiAdder]は、JPEGファイルのExif情報を追加、編集するアプリです。
JPEGファイルは、JPEG規格に則って圧縮された画像データですが、多くのJPEG
ファイルには画像データ以外に色々な情報が付加されています。
中には後で追加する事が想定されている項目もあります。例えば画像タイトル、
アーティスト、著作権者などです。
また、ExifにはGPSロケーション情報を追加する事が出来ます。
デジカメで撮影した画像にロケーション情報を追加する方法も幾つかあります
が、手動で追加する事も認められています。

PosiAdderは、Position Adderの略であり、主にロケーション情報の追加を目
的としています。
PosiAdderではロケーションの追加にOpenStreetMapを利用しています。インター
ネットに接続できる環境でご利用下さい。
また、Exif情報の無いJPEG画像にも追加できます。

楽しかった旅行の写真を見返しながら、情報を追加してみては如何でしょうか。


インストール
~~~~~~~~~~~~
Install.exeを実行して下さい。
アップデートのときもInstall.exeを実行して下さい。


アンインストール
~~~~~~~~~~~~~~~~
Windowsの『アプリと機能』から削除してください。


使い方
~~~~~~
大切なファイルを処理するときは、事前にバックアップを取って下さい。

JPEG画像を読み込むと、[Exif情報]ページにExif情報が表示されます(全てで
はありません。メーカーノートなどは表示しません)。
[イメージ]ページには読み込んだJPEG画像が表示されます(サムネイルではあり
ません)。
[Exif編集]ページで、編集可能な項目の追加、編集が出来ます。右端にASCIIと
表示された項目は半角英数字のみ入力可能です(Exifの仕様による)。
ユーザーコメントはマルチバイト文字も使えます。PosiAdderでは、ユーザー
コメントをExifに追加する際の文字コードを選べます。
[GPS]ページでロケーション情報の追加、編集が出来ます。
JPEGファイルにGPS情報が無いとき、デフォルトで東京駅丸の内口辺りが表示
されます(変更可)。
登録したい場所を地図の中心にして[位置取得]ボタンを押下するとその場所の
緯度経度が表示されます。
(地図をクリックしてもその場所が勝手に中心に来たりはしません)
または緯度経度を手入力して[場所を表示]ボタンを押下すると地図の該当箇所
が表示されます。
[測位地点の名称]にはマルチバイト文字が使えます。
[方位を有効にする]をチェックすると、撮影した画像の方向を設定出来るよう
になります。コンパス上の、該当する方位をクリックして下さい(コンパス中
心からの距離は関係ありません)。
(地図をクリックしても勝手に方位が設定されたりはしません)
このページの情報を書き込むには、[更新]ボタンを押下して下さい。

[GPS]ページで右クリックすると、ポップアップメニューから[GPSデータ待避]
が出来ます。待避した情報は[GPSデータ復帰]で他のJPEG画像に利用できます。

[設定]ダイアログでは次の設定が可能です。

[ASCII項目のマルチバイト文字の書き込みを許可する]にチェックを入れると、
Exifの仕様ではASCIIコードしか認められていない[画像タイトル][アーティス
ト][撮影著作権者][編集著作権者][カメラ所有者]にマルチバイト文字が書き
込めるようになります。また、書き込まれたマルチバイト文字の表示にも対応
します。ただし、Exifのタグ情報上はASCIIと記入され、読み出し時に実際に
書かれた文字コードは判りません。
PosiAdderでは[読込時のマルチバイト文字]で選択されたコードで読み込みます。
ここで選べるのはJIS、SJIS、UTF8の三種類です(EUCも選べますが、動作は未
検証です)。

[出力時のマルチバイト文字]は、マルチバイトでの記入が可能な[ユーザーコ
メント][測位地点の名称]書き込みの文字コードです。ASCII項目へのマルチバ
イト書き込みを許可しているときは、それらの項目もこのコードで書かれます
(マルチバイトのとき。シングルバイトはASCIIで書かれる)。

[Exifを新規作成するとき、必須タグを出力する]にチェックを入れると、Exif
のないJPEGファイルに新たにExifを追加するときに仕様上の必須タグを書き出
します。

[Open Street Map のURL]は、通常は変更の必要はありません。万一URLが変更
になったとき、ここを修正する事で対応できるかも知れません。ただし地図を
動かしたときの中心位置の戻り方が変更になると対応できません。
ここを変更して戻せなくなったときは、PosiAdder.iniのCONFIGセクションに
あるOSM_URLエントリを行ごと削除してからPosiAdderを起動して下さい。

[デフォルトの地図ロケーション]は、GPS情報の無いJPEG画像を読み込んだとき
に表示される場所です。何カ所か、適当に設定しています。ユーザーが好みの
場所を登録する事も出来ます。

[Exif 待避可能項目][GPS 待避可能項目]は、データを待避しておき、復帰でき
る項目です。

※『編集可能な項目』は、flymanが勝手に『後から変更しても構わない』と思
う項目を選んでいます。例えば、シャッタースピードや絞り値など、殆どの撮
影情報は後から変更すべき項目では無いため、対象外です。温度や湿度などは
書き込むニーズが無さそうなので外しました。
また、ロケーション情報の、目的地に関する情報など、flymanが『編集は必要
ない』と思った項目も対象から外しました。

※Exifの仕様から外れた内容は文字化けしたりエラーを引き起こしたりするか
も知れません。例えば、画像タイトルや著作権者などはASCII文字でしか書け
ません。ここにUnicodeで記入されてもPosiAdderでは原則として対応しません。
画像編集ソフトの中には、文字コード違い以外にもExif情報を破壊してしまう
ものが少なくないようです。


内部情報など
~~~~~~~~~~~~
ExifデータはAPP1セグメントに書かれます。仕様により、APP1セグメントはJP
EG開始マーカーの直後に書かれなければなりません。
APP1セグメントには、主画像の情報である0th IFDとサムネイルの情報である
1st IFDがあります(1st IFDは無くても良い)。
各IFDの中には情報のヘッダーと情報の値があり、情報のヘッダー(タグ)は昇順
に並んでいます。

画像処理ソフトの中には、上述のような仕様を無視するものがあります。
PosiAdderでは、致命的な破壊でない限り、その様な、仕様を無視したファイル
もなるべく読むようにしています。また、APP1セグメント以外はそのまま出力
されますが、JFIF情報(APP0セグメント)は削除します。これは、APP1とAPP0が
どちらもJPEG SOI(スタート・オブ・イメージ)マーカー直後に置かれる仕様に
なっているからです(排他的)。
また、デフォルトではJPEG EOI(エンド・オブ・イメージ)マーカーの後ろに書
かれた情報は削除します。EOI以降にデータを追加するようなアプリを使って
いる場合は設定を変更して下さい。
Exif情報の無いJPEGファイルに情報を追加する場合、PosiAdderは新たにExif
情報を書き込みます。Exifには次のような、記載が必須のタグがあります。
  画像の幅の解像度 = 72
  画像の高さの解像度 = 72
  画像の幅と高さの解像度の単位 = インチ
  YCCの画素構成(YとCの位置) = 中心
  Exif バージョン = 0232
  各コンポーネントの意味 = 1230
  対応フラッシュピックスバージョン = 0100
  色空間情報 = sRGB
  実効画像幅
  実効画像高さ
PosiAdderでは内容が正しいかどうかを考慮せず、デフォルトでは上述の内容
でタグを追加します。実効画像の幅と高さは画像の表示サイズを設定していま
す(パディングは考慮しない)。設定で、これらのタグを出力しないようにも出
来ます。
拡張子が.JPGや.JPEGで内容がBitmapなどの画像ファイルは[イメージ]ページに
表示はされますがPosiAdderではハンドリングできません。
また、Exifは仕様上、非圧縮ファイルにも追加できますが、PosiAdderでは対応
していません。ちなみにExifが対象とする非圧縮ファイルはTIFF形式のもので
す。

flymanが所持しているデジカメはキャノン製とリコー製が多く、動作確認のた
めの画像があまり多くありませんでした。そのため、予期しないバグ(Exifの
バグもPosiAdderのバグも)が顕在化する可能性があります。
大切な写真を加工するときは事前のバックアップを強くお勧めします。

[出力時のマルチバイト文字]で選択可能な文字は、JIS、UNICODE、UTF8、SJIS
です。UNICODEはUTF16で書かれます。ただしSJISのとき識別コードはUndefined
になります。
本来、Undefinedの文字を読むリーダーは文字種を識別する機能を搭載する必要
がありますが、PosiAdderは搭載していません(設定内容で決め打ち)。もしEUC
などで書かれていたら読めません。
[読込時のマルチバイト文字]で選択可能な文字は、JIS、UTF8、SJISです。この
文字コードは、ASCII項目にマルチバイト文字が書かれた、イレギュラーな情報を
読むのに使われます。そのため、本来のASCII文字を読み込めるように、ASCII
を内包していないUNICODE(UTF16)は設定できません(JISもASCIIを内包していま
せんが、SI、SOでASCIIと区別するので大丈夫と思われる)。

なをマルチバイト文字のハンドリングについては検証が全く不十分です。ご承
知おき下さい。これはサンプルになるJPEG画像が殆ど手に入らないからです。

ASCII項目にマルチバイト文字を入力する事は仕様に違反しています。止めた
方が良いでしょう。特に、[ASCII項目へのマルチバイト文字の書き込みを許可
する (仕様違反)]をチェックして、[出力時のマルチバイト文字]をUNICODEに
すると、PosiAdder自身でも表示できなくなります。読込時のコードにUNICODE
が無いからです(マルチバイト文字が許可されている項目は大丈夫です)。
Exif仕様書で規定されている識別コードは、ASCII、JIS、Unicodeです。これ
以外はUndefinedになります。
ところで、Unicodeについてはそれ以上、Exif仕様書には規定されていません
(特定のタグの説明に『Unicode(UCS-2)文字列はSignatureを含み、NULLで終端
する』とあるので、これがExif仕様全体に当てはまるとすると、BOMを付けろ、
という事かも知れません)。
PosiAdderではUnicodeとしてUTF16とUTF8を書き出せます。しかし、他のExif
リーダーがこれらを読めるかは知りません。

出力時の文字で、SJISは上に述べたとおり、識別コードがUndefinedになり、
文字の判別はExifリーダーに任されます。しかし、短い文字列でSJISとEUCを
判別するのは、どのExifリーダーでも困難だと思われます。もし予め使用する
Exifリーダーが決まっているのなら、PosiAdderの文字コードをそのリーダー
で確実に読めるものに設定して下さい。

ちなみに(クソ)Windows10では画像のプロパティからExif情報を変更できます。
例えば『タイトル』や『作成者』にマルチバイトで書き込む事も可能ですが、
その場合はUTF8で書かれるようです。
PosiAdderで読込時のコードをUTF8にすればこの様な仕様違反の項目も読めま
すが、書き戻す場合は注意が必要です。書込時のコードが読込時のコード(こ
の場合はUTF8)でない場合、コード変換されて書き戻されるため、Windows10で
表示した場合に文字化けするようになります。

バージョン[0.2.1]より、GPS情報を書き込むとGPS日付にUTCの日付を記入する
ようになりました。日付のみで時刻は書かないので、flymanとしてはJST(ロー
カル日付)で書く方が便利な気がしますが、仕様でUTCと決められているのでそ
れに従いました。そのため実際の記入日と日付がずれる事があります(後から
見直してもずれたかどうかは判別できない)。

[方位を有効にする]をチェックせずにコンパスをダブルクリックすると、コン
パスの背景が変更できます。

バージョン[0.2.3]より、GPS位置情報を保存できるようになりました。保存し
た情報はポップアップメニューに追加され、これらを選択すればその情報を呼
び出す事が出来ます。

PosiAdderの仕様は予告なく変更する事があります(というか、します)。ご了
承下さい。


変更履歴
~~~~~~~~
[0.1.3] 2020.06.11
[0.2.0]      06.13 ファイルのドラッグ&ドロップ、実行時パラメータに対応
                   ボタンを廃止し、メニュー、スピードボタンを配置
                   OpenStreetMapのURLをフォーマット用文字列に変更
                   マルチバイトコードを選択可能に
                   読込(表示)用マルチバイトコードを設定(イレギュラーなデータに対応)
                   [Exif編集]ページの更新ボタンを廃止
                   イレギュラーな書き込みに対応(非推奨)
[0.2.1]      06.13 GPS日付にロケーション記入日(UTC)をセット
                   撮影した画像の方向を設定可能に
                   EUCでの読み込みに対応(動作未検証)
[0.2.2]      06.15 デフォルトのロケーションを選択可能に
                   待避・復帰可能項目を選択可能に
                   Exif新規作成時の必須タグ出力を選択可能に
                   EOIマーカー以降の出力に対応
[0.2.3]      06.23 ロケーションを記憶可能に
                   64bit版を追加
                   書き出すべきセグメントを捨てていたのを修正


著作権・免責・その他
~~~~~~~~~~~~~~~~~~~~
本プログラムの著作権は flymanが保持しています。
本プログラムを使用したことによって生じる如何なる障害も作者は一切責任を
負いません。大切なファイルを処理するときは、事前にバックアップを取って
下さい。

Beepを除く音源の著作権は 魔王魂 にあります。
PosiAdder自体は地図情報を内包しません。地図はインターネット上のOpen
StreetMapをそのまま利用しています。