■01 初めに

		【名称      】BonsExif
		【制作者名  】大石  剛司
		【動作環境  】Windows10,Windows7
		【検索キー  】BXA03027,BonsExif,Bons,annsFM,Exif
		【サポート  】私宛にメールを下さい。BXA03027@nifty.ne.jp
		【サポート  】http://bonworld.sblo.jp/
		【ソフト種別】フリーソフトウェア
		【転載条件  】転載を希望される方は、事前に私宛にメールをください。

■02 ソフト紹介

	▼	画像ファイルの JPG, JPEG, TIF, TIFF の画像の Exif 情報の表示と削除
		が可能です。

	▼	Intel と Motorola に対応しています。

	▼	JPG(JPEG)は、APP0 と APP1 に対応しています。

	▼	JPG(JPEG)は、Exif 情報の削除（画像方向は削除しません）が可能です。

	▼	TIF(TIFF)は、Exif 情報のクリア（削除ではありません）が可能です。

	▼	他のアプリケーションからの、ドラッグアンドドロップが可能です。

	▼	ドラッグアンドドロップまたはファイラーからレスポンスファイルで指定
		すると、Exif の一括処理が可能です。

■03 操作

	▼	「BonsExif.exe」を任意のフォルダーに解凍します。

	▼	「BonsExif.exe」を起動します

	▼	メニューの「ファイル」「ファイルを開く」で、画像ファイルを選択しま
		す。
		BonsExif 独自の方法で、解析を行い表示します。解析内容の詳細は「12 
		Exif情報」に記載されています。

	▼	メニューの「Exif表示」「Exif表示 ExifCcr」で、CCR.Exif を使用して
		解析します。

	▼	メニューの「Exif表示」「Exif表示 ExifInfo」で、ExifInfo を使用して
		解析します。

	▼	メニューの「Exif表示」「Exif表示 ExifShell」で、Windows の機能を使
		用して解析します。

	▼	メニューの「ファイル」「JPG ファイルの APP1( Exif) の画像方向以外
		を削除して、ファイル保存」で、Exif の削除が可能です。
		変更後のファイルの先頭に [No-Exif] を追加して、同一のフォルダに保
		存します。

	▼	メニューの「ファイル」「JPG ファイルの APP1( Exif) の画像方向以外
		を削除して、APP0 を削除して、ファイル保存」で、Exif の削除が可能で
		す。
		変更後のファイルの先頭に [No-Exif] を追加して、同一のフォルダに保
		存します。

	▼	メニューの「ファイル」「TIFF ファイルの APP1( Exif)) の画像方向以
		外を削除して、ファイル保存」で、Exif の削除が可能です。
		変更後のファイルの先頭に [No-Exif] を追加して、同一のフォルダに保
		存します。

	▼	メニューの「ファイル」「TIFF ファイルの必須情報以外を置き換えて、
		ファイル保存」で、Exif のクリアが可能です。
		変更後のファイルの先頭に [No-Exif] を追加して、同一のフォルダに保
		存します。

	▼	メニューの「設定」「ウィンドウ位置の記憶」で、現在位置を記憶します。

	▼	メニューの「設定」「リスト幅の初期化」で、リスト幅を元の幅に戻しま
		す。
		リスト上部の各項目の区切りをマウスで移動すると、幅の変更が可能です。

	▼	メニューの「設定」「複数起動可」をチェックすると、複数の起動が可能
		になります。
		チェックしない場合は、起動された「BonsExif」が有効となり、既に起動
		していた「BonsExif」は終了します。

	▼	メニューの「設定」「Escで終了」をチェックすると、「Esc」キーで終了
		します。

	▼	メニューの「設定」「Qで終了」をチェックすると、「Q」キーで終了しま
		す。

	▼	メニューの「設定」「画像表示」をチェックすると、画像を表示します。

	▼	メニューの「設定」「ファイル保存時に、タイムスタンプを保持」をチェ
		ックすると、Exif 情報を削除したファイルのファイルスタンプを削除前
		と同じに設定します。

	▼	メニューの「設定」「ファイル保存時に、ファイル属性を保持」をチェッ
		クすると、Exif 情報を削除したファイルのファイル属性を削除前と同じ
		に設定します。

	▼	アプリケーションの紹介
		Exif情報を完全に削除したい場合は、以下をお勧めします。
		「遠雷」様のサイトの「Exif読取り君」

		カメラメーカ毎の情報が欲しい場合は、以下をお勧めします。
		「かみさか」様のサイト「JpegAnalyzer Plus」

		ダウンロード先は「13 謝辞」に記載しています。

	▼	コマンドラインの設定。
		コマンドラインにファイル名を設定した場合は、自動的に情報を表示しま
		す。
		ファイル名は、フルパスで指定して下さい。

		「annsView」のメニューの「表示」の「Exif情報表示ソフトの設定」の
		「コマンドパラメータ」は「%s」でなく「"%s"」と設定して下さい。
		フルパスのファイル名に空白が含まれる場合には「"%s"」と設定して下さ
		い。「%s」ではファイル名が分割されて渡されます。
		「BonsExif」のメニューの「ファイル」の「コマンドライン表示」で渡さ
		れた内容の確認が可能です。

		ファイル名の先頭が「@」で始まっている場合は、ファイル名はレスポン
		スファイルとして扱います。
		レスポンスファイルは、フルパスで設定して下さい。

■04 一括削除

	▼	コマンドラインの設定
		コマンドラインにファイル名を設定した場合は、自動的に情報を表示しま
		す。
		ファイル名は、フルパスで指定して下さい。

		ファイル名の先頭が「@」で始まっている場合は、ファイル名はレスポン
		スファイルとして扱います。
		レスポンスファイルは、フルパスで設定して下さい。

	▼	レスポンスファイルの内容
		ファイル名をフルパスで1行毎に設定して下さい。

	▼	画面構成
		一括削除の場合は「Exif削除」「中断」「表示変更」のボタンが表示され
		ます。
		状況一覧の「-----------」は、ファイルの変換情報を表示していて、先
		頭から順番に以下の内容となっています。
		警報の「#」は削除とは無関係で、削除自体は問題ありません。

		01 Exifの削除を実行すると「-」が「@」に変更されます。
		02 bDeleteFileError  異常で「-」が「*」に変更されます。
		03 bGetOffsetWarning 警報で「-」が「#」に変更されます。
		04 bGetFileError     異常で「-」が「*」に変更されます。
		05 bGetSizeError     異常で「-」が「*」に変更されます。
		06 bSaveFileError    異常で「-」が「*」に変更されます。
		07 bSaveExtError     異常で「-」が「*」に変更されます。
		08 bSaveInfoError    異常で「-」が「*」に変更されます。
		09 bSaveHandleError  異常で「-」が「*」に変更されます。
		10 bSaveSizeError    異常で「-」が「*」に変更されます。
		11 bSaveTimeError    異常で「-」が「*」に変更されます。
		12 bSaveAttrError    異常で「-」が「*」に変更されます。

	▼	「Exif削除」
		先頭から順番に Exif を削除していきます。
		「BonsExif.exe」と同じフォルダに、「BonsExof-Log.txt」で、ログファ
		イルが自動的に保存されます。

	▼	「中断」
		処理を中断します。

	▼	「表示変更」
		表示は「状況一覧」と「ファイル名一覧」が切り替わります。
		「状況一覧」は「番号」「状況」「ファイル名」が表示されます。
		「ファイル名一覧」は、フルパス名が表示されｍす。

■05 操作（Jpn/Eng）

	▼	Japanese
		日本語の表示に切り替えます。

	▼	English
		英語の表示に切り替えます。

■06 動作環境

	▼	Windows10 32Bit 日本語

	▼	Windows7  32Bit 日本語

■07 annsFM との連携

	▼	「annsFM」の「マクロ設定」で、プログラム起動「-KR」で指定します。
		プログラム名は「BonsExif.exe」をフルパスで指定して下さい。
		オプションは「無し」を指定して下さい。
		ファイル指定は「/Q」を指定して下さい。

■08 インストール

	▼	圧縮ファイルを解凍して下さい。以下のファイルが含まれています。
		BonsExif.exe     : 実行ファイル
		BonsExif.txt     : 説明ファイル
		BonsExif.chm     : ヘルプファイル
		\Language\BonsExif\ExifCcrExif.txt  : 言語ファイル
		\Language\BonsExif\ExifExifInfo.txt : 言語ファイル
		\Language\BonsExif\ExifShell.txt    : 言語ファイル
		\Language\BonsExif\Help.txt         : 言語ファイル
		\Language\BonsExif\Main.txt         : 言語ファイル

		Language」フォルダと配下のファイルを、「BonsExif.exe」
		をコピーしたフォルダにコピーします。

■09 アンインストール

	▼	解凍したファイルを削除して下さい。

	▼	実行したフォルダに作成された以下のファイルを削除してして下さい。
		BonsExif.ini
		BonsExif-Exf.txt（ExifInfo情報のリスト）
		BonsExif-Ccr.txt（CCR.Exif情報のリスト）
		BonsExif-Pro.txt（プロパティ情報のリスト）
		BonsExif-Log.txt（一括削除のログリスト）
		BonsExif-Rcv.txt（ドラッグアンドドロップされたファイルリスト）

	▼	レジストリは使用していません。

■10 開発環境

		Windows10 の Delphi XE2 日本語版で開発しました。
		Ver4.00 からは、Windows10 の Delphi 12 29.0.51961.7529 日本語版で開発
		しました。

■11 転載・再配布の条件

	▼	このプログラムはフリーソフトウェアです。著作権は放棄していません。
		転載は基本的に自由ですが，以下の点を守って下さい。
		他のネットへ転載される場合は、事前に連絡をお願いします。
		雑誌、書籍等に掲載、添付等をされる場合には、事前に連絡をお願いしま
		す。
		転載はアーカイブの構成は変えないで下さい。
		フリーソフトウェアであることを明示してください。

■12 保証範囲

	▼	このプログラムを使用することによって、あるいは使用できなかったこと
		によって、なんらかの損害が生じても、作者は一切責任を負いません。
		各自の責任において御利用ください。

■13 改定履歴

	▼	Ver1.0 2017-10-20
		01：最初の公開。
	▼	Ver1.1 2017-10-20
		01：WindowsXｐ の場合は、「ExifShell」の機能を無効にしました。
	▼	Ver1.2 2017-10-20
		01：メニューの「Exif 表示 ...」の機能は、ファイルが読み込まれてい
		ない場合には無効にしました。
	▼	Ver1.3 2017-10-20
		01：コマンドラインを指定して起動された場合に、情報部分が表示されな
		い不具合に対応しました。
	▼	Ver1.4 2017-11-01
		01：ファイルオープンで、一括削除の機能を可能にしました。
	▼	Ver1.5 2017-11-10
		01：ドラッグアンドドロップで、一括削除の機能を可能にしました。
	▼	Ver2.0 2017-11-14
		01：起動時に「annsFM」と「BonsFM」が終了してしまう不具合に対応しま
		した。
		複数起動を許可しない場合に、「BonsExif」を終了する判定で、タイトル
		バーの検索結果を厳密に判定するように変更しました。
	▼	Ver2.1 2017-11-16
		01：ドラッグアンドドロップで「Recv.txt」が作成されていましたが、フ
		ァイル名を「BonsExif-Rcv.txt」に変更しました。
	▼	Ver2.2 2017-11-17
		01：メニューの「設定」「画像表示」で、縮小した画像を表示する機能を
		追加しました。
		02：対象ファイル以外の場合は、「Exif 削除の対象ファイルではありま
		せん。」の表示を行うようにしました。
		03：フォームのタイトル名が間違っているのを修正しました。
	▼	Ver2.3 2017-11-17
		01：メニューの「Exif表示」の「Exif表示 ExifInfo」を操作した時に、
		「annsView」で同じ画像を表示している場合は、エラーになっていました。
		この場合は、「annsView を閉じて下さい」のメッセージを表示するよう
		に変更しました。
	▼	Ver2.4 2017-11-25
		01：メニューの「設定」「画像表示」で、縮小した画像を表示する機能で、
		大きな画像が表示できない不具合に対応しました。
	▼	Ver2.5 2018-12-31
		01：メニューの「ファイル」「コマンドライン表示」で、コマンドライン
		に渡された文字の表示を可能にしました。
	▼	Ver3.0 2019-09-02
		01：外部プログラム起動で、カレントディレクトリは実行ファイルのパス
		を指定するように変更しました。
		02：ヘルプの構成を「.chm」から「.txt」に変更しました。
		03：「OX012D」「OX0012」の情報取得が間違っているのを修正しました。
	▼	Ver3.10 2021-07-03
		01：メニューに「Jpn/Eng」を追加しました。日本語と英語の切替が可能
		となりました。
	▼	Ver3.20 2021-08-19
		01：メイン画面のメニューに言語切替の設定ファイルの内容を変更しまし
		た。
	▼	Ver3.30 2022-10-24
		01：Windows11でIMEを使用した時にクラッシュする不具合の対策を行いま
			した。ただし手元では確認ができる環境が在りませんので対策の確認
			は出来ていません。
	▼	Ver4.00 2026-01-26
		01：開発環境を Delphi 12 29.0.51961.7529 に変更しました。
		02：マニュフェストで「DPIの認識」は「対応せず」に設定しました。

■14 Exif情報

Exif 情報の取得は４種類の方法で行っています。

1：BonsExif独自で、バイナリで解析
2：CCR.Exif を使用してデータを取得（Delphi のコンポーネントを経由して取得）
3：ExifInfo を使用してデータを取得（Delphi のコンポーネントを経由して取得）
4：ファイルのプロパティを取得（エクスプローラのプロパティと同じ内容）

★ BonsFExif独自の解析（Exifのみ）

01：Jpg の インテル系の例を以下に示します。

例 FF D8 FF E1 00 10 45 78 69 66 00 00 49 49 2A 00 08 00 00 00 
FF D8：JPG
FF E1：APP1
00 10：セグメント長
45 78 69 66 00 00：Exif''
49 49：バイトオーダ
2A 00：固定
08 00 00 00：IFDオフセット

例 02 00 ** ** @@ @@ ## ## ## ## $$ $$ $$ $$ ** ** @@ @@ ## ## ## ## $$ $$ $$ $$ %% %% %% %%
02 00：カウント数
** **：タグ
@@ @@：タイプ
## ## ## ##：カウント
$$ $$ $$ $$：オフセット
** **：タグ
@@ @@：タイプ
## ## ## ##：カウント
$$ $$ $$ $$：オフセット
%% %% %% %%：継続IFDへのオフセット

02：Jpg のファイルはファイルの先頭から以下の構造になっています。
APP0 から APP15 までは、必須ではありません。
一般的な Exif情報は APP1 に格納されています。
DQT,DHT は複数存在する場合があります。

FF D8 SOI   イメージ開始
FF E0 APP0  タイプ  0 アプリケーションセグメント
FF E1 APP1  タイプ  1 アプリケーションセグメント
...
FF EF APP15 タイプ 15 アプリケーションセグメント
FF D8 DQT   量子化テーブル
FF C4 DHT   ハフマンテーブル
FF D9 SOI   イメージ終了

03：データの構造について解説しておきます。
データの格納方法では、BigEndian と LittleEndian が存在します。
BigEndian    は、モトローラ系の CPU で、データの書込順序が、高いバイト順か
ら書き込まれます。
LittleEndian は、インテル系  の CPU で、データの書込順序が、低いバイト順か
ら書き込まれます。
BigEndian の 00 2A のデータは、BigEndian では 00 2A 、LittleEndian は 2A 00 
になります。

04：ファイルをバイナリーで読み込んで解析を行います。
ファイルの先頭部分で、JPG かTIF か、APP1 の有無、BigEndian と LittleEndian 
を判定します。

05：APP1 のデータを解析します。
APP1 には、
APPの識別コード[2 バイト] + セグメント長[2 バイト] + EXIF識別コード[6 バイト] 
の構成です。
APPの識別コードは、APP1 なので FF E1 になります。
セグメント長は、この APP の長さが、BigEndian で格納されています。
EXIFの識別コードは、45 78 69 68 00 00（Exif''）で格納されています。

06：TIFF ヘッダーのデータを解析します。
TIFF ヘッダー は、
バイトオーダ[2 バイト] + Exif指定[2 バイト] + IFDオフセット[4 バイト] 
の構成です。
バイトオーダは、エンディアンに関する設定です。
4D 4D は BigEndian、49 49 は LittleEndian を意味します。
Exif指定は固定で、BigEndian では 00 2A、LittleEndian では 2A 00 になります。
IFDオフセットは、次の IFD までのオフセットを指定しますが、通常は次にあるた
め、TIFF ヘッダーからのバイト数の 2+2+4 = 8 を指定する事になります。
BigEndian では 00 00 00 08、LittleEndian では 08 00 00 00 になります。

従って TIFF Heddaer は以下のようになります。

BigEndian    4D 4D 00 2A 00 00 00 08
LittleEndian 49 49 2A 00 08 00 00 00

07：IFD の解析を行います。
IFD は、
フィールドの個数[2 バイト] + フィールド[12 バイト] + フィールド[12 バイト] + ... + IFDオフセット[4 バイト] 
の構成です。

フィールドは、
タグ[2 バイト] + タイプ[2 バイト] + 個数[4 バイト] + オフセット[4 バイト] 
の構成です。
タグには「画像の幅 0x0100」なら 01 00 が入ります。
00 01 (Little) または 01 00 (Big) が入ります。

タイプには、「Short」      なら     3 が入ります。
08 00 (Little) または 00 03 (Big) が入ります。

個数には、データの個数が入り、「画像の幅 0x0100」では 1 が入ります。
01 00 (Little) または 00 01 (Big) が入ります。

オフセットには、データが入ります。タイプ＊個数のバイト数が 4 バイト以下で
あれば、オフセットにデータが格納されます。
4 バイトを超える場合は、オフセットには、データが格納されているオフセット値
が入ります。なおオフセットは TIFF ヘッダーの先頭からのバイト数になります。
データはアドレスの低い順にはいります。
「Short」が 1個の場合はの場合は nn nn 00 00、2個の場合は nn nn mm mm が入ります。
オフセットのデータの nn nn と mm mm も Little と Big に従います。

09：以上のルールに従って解析を行います。
実際のプログラムは以下になっています。

//JPEG + Exif (Motorola)
(Stream1.Bytes[ 0] = $FF) and (Stream1.Bytes[ 1] = $D8) and  //JPG
(Stream1.Bytes[ 2] = $FF) and (Stream1.Bytes[ 3] = $E1) and  //固定
(Stream1.Bytes[ 6] = $45) and (Stream1.Bytes[ 7] = $78) and  //Ex
(Stream1.Bytes[ 8] = $69) and (Stream1.Bytes[ 9] = $66) and  //if
(Stream1.Bytes[10] = $00) and (Stream1.Bytes[11] = $00) and  //
(Stream1.Bytes[12] = $4D) and (Stream1.Bytes[13] = $4D) and  //Motorola
(Stream1.Bytes[14] = $00) and (Stream1.Bytes[15] = $2A) then //固定

//JPEG + Exif (Intel)
(Stream1.Bytes[ 0] = $FF) and (Stream1.Bytes[ 1] = $D8) and  //JPG
(Stream1.Bytes[ 2] = $FF) and (Stream1.Bytes[ 3] = $E1) and  //固定
(Stream1.Bytes[ 6] = $45) and (Stream1.Bytes[ 7] = $78) and  //Ex
(Stream1.Bytes[ 8] = $69) and (Stream1.Bytes[ 9] = $66) and  //if
(Stream1.Bytes[10] = $00) and (Stream1.Bytes[11] = $00) and  //
(Stream1.Bytes[12] = $49) and (Stream1.Bytes[13] = $49) and  //Intel
(Stream1.Bytes[14] = $2A) and (Stream1.Bytes[15] = $00) then //固定

//TIFF + Exif (Motorola)
(Stream1.Bytes[ 0] = $FF) and (Stream1.Bytes[ 1] = $E1) and  //TIFF
(Stream1.Bytes[ 4] = $45) and (Stream1.Bytes[ 5] = $78) and  //Ex
(Stream1.Bytes[ 6] = $69) and (Stream1.Bytes[ 7] = $66) and  //if
(Stream1.Bytes[ 8] = $00) and (Stream1.Bytes[ 9] = $00) and  //
(Stream1.Bytes[10] = $4D) and (Stream1.Bytes[11] = $4D) and  //Motorola
(Stream1.Bytes[12] = $00) and (Stream1.Bytes[13] = $2A) then //固定

//TIFF + Exif (Intel)
(Stream1.Bytes[ 0] = $FF) and (Stream1.Bytes[ 1] = $E1) and  //TIFF
(Stream1.Bytes[ 4] = $45) and (Stream1.Bytes[ 5] = $78) and  //Ex
(Stream1.Bytes[ 6] = $69) and (Stream1.Bytes[ 7] = $66) and  //if
(Stream1.Bytes[ 8] = $00) and (Stream1.Bytes[ 9] = $00) and  //
(Stream1.Bytes[10] = $49) and (Stream1.Bytes[11] = $49) and  //Intel
(Stream1.Bytes[12] = $2A) and (Stream1.Bytes[13] = $00) then //固定

//TIFF Motorola
(Stream1.Bytes[ 0] = $4D) and (Stream1.Bytes[ 1] = $4D) and  //Motorola
(Stream1.Bytes[ 2] = $00) and (Stream1.Bytes[ 3] = $2A) then //固定

//TIFF Intel
(Stream1.Bytes[ 0] = $49) and (Stream1.Bytes[ 1] = $49) and  //Intel
(Stream1.Bytes[ 2] = $2A) and (Stream1.Bytes[ 3] = $00) then //固定

//JPEG + JFIF + Exif (Motorola)
(Stream1.Bytes[ 0] = $FF) and (Stream1.Bytes[ 1] = $D8) and  //JPG
(Stream1.Bytes[ 2] = $FF) and (Stream1.Bytes[ 3] = $E0) and  //固定
(Stream1.Bytes[ 6] = $4A) and (Stream1.Bytes[ 7] = $46) and  //JF
(Stream1.Bytes[ 8] = $49) and (Stream1.Bytes[ 9] = $46) and  //IF
(Stream1.Bytes[10] = $00) and                                //
(Stream1.Bytes[20] = $FF) and (Stream1.Bytes[21] = $E1) and  //固定
(Stream1.Bytes[24] = $45) and (Stream1.Bytes[23] = $78) and  //Ex
(Stream1.Bytes[26] = $69) and (Stream1.Bytes[27] = $66) and  //if
(Stream1.Bytes[27] = $00) and (Stream1.Bytes[29] = $00) and  //
(Stream1.Bytes[30] = $4D) and (Stream1.Bytes[31] = $4D) and  //Motorola
(Stream1.Bytes[32] = $00) and (Stream1.Bytes[33] = $2A) then //固定

//JPEG + JFIF + Exif (Intel)
(Stream1.Bytes[ 0] = $FF) and (Stream1.Bytes[ 1] = $D8) and  //JPG
(Stream1.Bytes[ 2] = $FF) and (Stream1.Bytes[ 3] = $E0) and  //固定
(Stream1.Bytes[ 6] = $4A) and (Stream1.Bytes[ 7] = $46) and  //JF
(Stream1.Bytes[ 8] = $49) and (Stream1.Bytes[ 9] = $46) and  //IF
(Stream1.Bytes[10] = $00) and                                //
(Stream1.Bytes[20] = $FF) and (Stream1.Bytes[21] = $E1) and  //固定
(Stream1.Bytes[24] = $45) and (Stream1.Bytes[25] = $78) and  //Ex
(Stream1.Bytes[26] = $69) and (Stream1.Bytes[27] = $66) and  //if
(Stream1.Bytes[28] = $00) and (Stream1.Bytes[29] = $00) and  //
(Stream1.Bytes[30] = $49) and (Stream1.Bytes[31] = $49) and  //Intel
(Stream1.Bytes[32] = $2A) and (Stream1.Bytes[33] = $00) then //固定

★ BonsExif 独自の解析（JFIF）

01：Jpg の インテル系の例を以下に示します。

例 FF D8 FF E0 00 10 4A 46 49 46 00 01 01 00 00 01 00 01 00 00 

FF D8：JPG
FF E0：APP0
00 10：セグメント長
4A 46 49 46 00：JFIF'
01 01：バージョン
00 ：解像度単位
00 01：横解像度
00 01：縦解像度
00：サムネイル横サイズ
00：サムネイル縦サイズ

例 FF E1 3A 15 45 78 69 66 00 00 49 49 2A 00 08 00 00 00 
FF E1：APP1
3A 15：セグメント長
45 78 69 66 00 00：Exif''
49 49：バイトオーダ
2A 00：固定
08 00 00 00：IFDオフセット

★ BonsExif 独自の JPG（Exif）の Exif 情報の削除（APP1）

APP1 は、
APPの識別コード[2 バイト] + セグメント長[2 バイト] + EXIF識別コード[6 バイト] 
の構成です。
APP1 の画像方向以外を削除しています。画像方向が未検出の場合は、「標準」で
保存しています。
データを削除しているので、ファイルサイズは小さくなっています。

★ BonsExif 独自の JPG（JFEF）の Exif 情報の削除（APP0 + APP1）

APP0 は、
APPの識別コード[2 バイト] + セグメント長[2 バイト] + JFIF識別コード[5 バイト]  + その他コード[9 バイト] 
の構成です。
APP1 が、APP0 に続いて設定されています。

APP1 は、
APPの識別コード[2 バイト] + セグメント長[2 バイト] + EXIF識別コード[6 バイト] 
の構成です。
APP1 に、画像方向を設定しますが、未検出の場合は、画像方向は「標準」で保存しています。

APP0 だけで APP1 が無い場合には、APP1 を無条件に設定し、画像方向を設定します。
画像方向が未検出の場合は、「標準」で保存しています。

★ BonsExif 独自の TIF の Exif 情報の削除

IFD 情報の以下の項目以外はクリアしています。
Exif 情報は、全てをクリアしています。
GPS 情報は、全てをクリアしています。
データは削除していないので、ファイルサイズは変わりません。

0x0100 画像の幅
0x0101 画像の高さ
0x0102 画像のビットの深さ
0x0103 圧縮の種類
0x0106 画素構成
0x0111 画像データのロケーション
0x0112 画像方向
0x0115 コンポーネント数
0x0116 ストリップ中のライン
0x0117 ストリップのデータ量
0x011A 画像の幅の解像度
0x011B 画像の高さの解像度
0x011C 画像データの並び
0x0128 画像の幅と高さの解像度の単位
0x8769 Exif IFDへのポインタ
0x8825 GPS IFDへのポインタ
0xA005 互換性IFDへのポインタ

★ CCR.Exif を使用してデータを取得（Delphi のコンポーネントを経由して取得）

「CCR.Exif 全データを取得」では以下のデータを取得しています
取得済みのデータは先頭に「●」を付加しました。
//  main dir tags
    ●property CameraMake: string index ttMake read GetGeneralString write SetGeneralString stored False;
    ●property CameraModel: string index ttModel read GetGeneralString write SetGeneralString stored False;
    ●property Copyright: string index ttCopyright read GetGeneralString write SetGeneralString stored False;
    ●property DateTime: TDateTimeTagValue read GetDateTime write SetDateTime stored False;
    ●property ImageDescription: string index ttImageDescription read GetGeneralString write SetGeneralString stored False;
    ●property Orientation: TExifOrientation index Ord(esGeneral) read GetOrientation write SetOrientation stored False;
    ●property Resolution: TCustomExifResolution read FResolution write SetResolution stored False;
    ●property Software: string index ttSoftware read GetGeneralString write SetGeneralString stored False;
//  main dir tags set by Windows Explorer (XP+)
    ●property Author: UnicodeString read GetAuthor write SetAuthor stored False; //falls back to ttArtist if nec
    ●property Comments: UnicodeString read GetComments write SetComments stored False; //falls back to ttUserComment in the Exif IFD if necessary
    ●property Keywords: UnicodeString index ttWindowsKeywords read GetGeneralWinString write SetGeneralWinString stored False; //see also Get/SetKeywords
    ●property Subject: UnicodeString index ttWindowsSubject read GetGeneralWinString write SetGeneralWinString stored False;
    ●property Title: UnicodeString index ttWindowsTitle read GetGeneralWinString write SetGeneralWinString stored False;
    property UserRating: TWindowsStarRating read GetUserRating write SetUserRating stored False;
//  sub dir tags
    ●property ApertureValue: TExifFraction index ttApertureValue read GetDetailsFraction write SetDetailsFraction stored False;
    ●property BodySerialNumber: string index ttBodySerialNumber read GetDetailsString write SetDetailsString stored False;
    ●property BrightnessValue: TExifSignedFraction index ttBrightnessValue read GetDetailsSFraction write SetDetailsSFraction stored False;
    ●property CameraOwnerName: string index ttCameraOwnerName read GetDetailsString write SetDetailsString stored False;
    ●property ColorSpace: TExifColorSpace read GetColorSpace write SetColorSpace stored False;
    ●property Contrast: TExifContrast read GetContrast write SetContrast stored False;
    ●property CompressedBitsPerPixel: TExifFraction index ttCompressedBitsPerPixel read GetDetailsFraction write SetDetailsFraction stored False;
    ●property DateTimeOriginal: TDateTimeTagValue index ttDateTimeOriginal read GetDetailsDateTime write SetDetailsDateTime stored False;
    ●property DateTimeDigitized: TDateTimeTagValue index ttDateTimeDigitized read GetDetailsDateTime write SetDetailsDateTime stored False;
    ●property DigitalZoomRatio: TExifFraction index ttDigitalZoomRatio read GetDetailsFraction write SetDetailsFraction stored False;
    ●property ExifVersion: TCustomExifVersion read FExifVersion write SetExifVersion stored False;
    ●property ExifImageWidth: TLongWordTagValue index ttExifImageWidth read GetDetailsLongWord write SetExifImageSize stored False;
    ●property ExifImageHeight: TLongWordTagValue index ttExifImageHeight read GetDetailsLongWord write SetExifImageSize stored False;
    ●property ExposureBiasValue: TExifSignedFraction index ttExposureBiasValue read GetDetailsSFraction write SetDetailsSFraction stored False;
    ●property ExposureIndex: TExifFraction index ttExposureIndex read GetDetailsFraction write SetDetailsFraction stored False; //old Kodak camera tag
    ●property ExposureMode: TExifExposureMode read GetExposureMode write SetExposureMode stored False;
    ●property ExposureProgram: TExifExposureProgram read GetExposureProgram write SetExposureProgram stored False;
    ●property ExposureTime: TExifFraction index ttExposureTime read GetDetailsFraction write SetDetailsFraction stored False; //in secs
    ●property FileSource: TExifFileSource read GetFileSource write SetFileSource stored False;
    ●property Flash: TExifFlashInfo read FFlash write SetFlash stored False;
    ●property FlashPixVersion: TCustomExifVersion read FFlashPixVersion write SetFlashPixVersion stored False;
    ●property FNumber: TExifFraction index ttFNumber read GetDetailsFraction write SetDetailsFraction stored False;
    ●property FocalLength: TExifFraction index ttFocalLength read GetDetailsFraction write SetDetailsFraction stored False;
    ●property FocalLengthIn35mmFilm: TWordTagValue read GetFocalLengthIn35mmFilm write SetFocalLengthIn35mmFilm stored False;
    ●property FocalPlaneResolution: TCustomExifResolution read FFocalPlaneResolution write SetFocalPlaneResolution stored False;
    ●property GainControl: TExifGainControl read GetGainControl write SetGainControl stored False;
    ●property ImageUniqueID: string index ttImageUniqueID read GetDetailsString write SetDetailsString stored False;
    ●property ISOSpeedRatings: TISOSpeedRatings read FISOSpeedRatings write SetISOSpeedRatings;
    ●property LensMake: string index ttLensMake read GetDetailsString write SetDetailsString stored False;
    ●property LensModel: string index ttLensModel read GetDetailsString write SetDetailsString stored False;
    ●property LensSerialNumber: string index ttLensSerialNumber read GetDetailsString write SetDetailsString stored False;
    ●property LightSource: TExifLightSource read GetLightSource write SetLightSource stored False;
    ●property MaxApertureValue: TExifFraction index ttMaxApertureValue read GetDetailsFraction write SetDetailsFraction stored False;
    ●property MeteringMode: TExifMeteringMode read GetMeteringMode write SetMeteringMode stored False;
    ●property OffsetSchema: TLongIntTagValue read GetOffsetSchema write SetOffsetSchema stored False;
    ●property RelatedSoundFile: string index ttRelatedSoundFile read GetDetailsString write SetDetailsString stored False;
    ●property Rendering: TExifRendering read GetRendering write SetRendering stored False;
    ●property Saturation: TExifSaturation read GetSaturation write SetSaturation stored False;
    ●property SceneCaptureType: TExifSceneCaptureType read GetSceneCaptureType write SetSceneCaptureType stored False;
    ●property SceneType: TExifSceneType read GetSceneType write SetSceneType stored False;
    ●property SensingMethod: TExifSensingMethod read GetSensingMethod write SetSensingMethod stored False;
    ●property Sharpness: TExifSharpness read GetSharpness write SetSharpness stored False;
    ●property ShutterSpeedValue: TExifSignedFraction index ttShutterSpeedValue read GetDetailsSFraction write SetDetailsSFraction stored False; //in APEX; for display, you may well prefer to use ShutterSpeedInMSecs
    ●property SpectralSensitivity: string index ttSpectralSensitivity read GetDetailsString write SetDetailsString;
    ●property SubjectDistance: TExifFraction index ttSubjectDistance read GetDetailsFraction write SetDetailsFraction stored False;
    ●property SubjectDistanceRange: TExifSubjectDistanceRange read GetSubjectDistanceRange write SetSubjectDistanceRange stored False;
    ●property SubjectLocation: TSmallPoint read GetSubjectLocation write SetSubjectLocation stored False;
    ●property WhiteBalanceMode: TExifWhiteBalanceMode read GetWhiteBalance write SetWhiteBalance stored False;
//  sub dir tags whose data are rolled into the DateTime properties, so don't display them for the sake of it
    ●property SubsecTime: string index ttSubsecTime read GetDetailsString write SetDetailsString stored False;
    ●property SubsecTimeOriginal: string index ttSubsecTimeOriginal read GetDetailsString write SetDetailsString stored False;
    ●property SubsecTimeDigitized: string index ttSubsecTimeDigitized read GetDetailsString write SetDetailsString stored False;
//  Interop
    ●property InteropTypeName: string read GetInteropTypeName write SetInteropTypeName stored False;
    ●property InteropVersion: TCustomExifVersion read FInteropVersion write SetInteropVersion stored False;
//  GPS
    ●property GPSVersion: TCustomExifVersion read FGPSVersion write SetGPSVersion stored False;
    ●property GPSLatitude: TGPSLatitude read FGPSLatitude write SetGPSLatitude;
    ●property GPSLongitude: TGPSLongitude read FGPSLongitude write SetGPSLongitude;
    ●property GPSAltitudeRef: TGPSAltitudeRef read GetGPSAltitudeRef write SetGPSAltitudeRef stored False;
    ●property GPSAltitude: TExifFraction index ttGPSAltitude read GetGPSFraction write SetGPSFraction stored False;
    ●property GPSSatellites: string index ttGPSSatellites read GetGPSString write SetGPSString stored False;
    ●property GPSStatus: TGPSStatus read GetGPSStatus write SetGPSStatus stored False;
    ●property GPSMeasureMode: TGPSMeasureMode read GetGPSMeasureMode write SetGPSMeasureMode stored False;
    ●property GPSDOP: TExifFraction index ttGPSDOP read GetGPSFraction write SetGPSFraction stored False;
    ●property GPSSpeedRef: TGPSSpeedRef read GetGPSSpeedRef write SetGPSSpeedRef stored False;
    ●property GPSSpeed: TExifFraction index ttGPSSpeed read GetGPSFraction write SetGPSFraction stored False;
    ●property GPSTrackRef: TGPSDirectionRef index ttGPSTrackRef read GetGPSDirection write SetGPSDirection stored False;
    ●property GPSTrack: TExifFraction index ttGPSTrack read GetGPSFraction write SetGPSFraction;
    ●property GPSImgDirectionRef: TGPSDirectionRef index ttGPSImgDirectionRef read GetGPSDirection write SetGPSDirection stored False;
    ●property GPSImgDirection: TExifFraction index ttGPSImgDirection read GetGPSFraction write SetGPSFraction;
    ●property GPSMapDatum: string index ttGPSMapDatum read GetGPSString write SetGPSString;
    ●property GPSDestLatitude: TGPSLatitude read FGPSDestLatitude write SetGPSDestLatitude;
    ●property GPSDestLongitude: TGPSLongitude read FGPSDestLongitude write SetGPSDestLongitude;
    ●property GPSDestBearingRef: TGPSDirectionRef index ttGPSDestBearingRef read GetGPSDirection write SetGPSDirection stored False;
    ●property GPSDestBearing: TExifFraction index ttGPSDestBearing read GetGPSFraction write SetGPSFraction stored False;
    ●property GPSDestDistanceRef: TGPSDistanceRef read GetGPSDestDistanceRef write SetGPSDestDistanceRef stored False;
    ●property GPSDestDistance: TExifFraction index ttGPSDestDistance read GetGPSFraction write SetGPSFraction stored False;
    ●property GPSDifferential: TGPSDifferential read GetGPSDifferential write SetGPSDifferential stored False;
    ●property GPSDateTimeUTC: TDateTimeTagValue read GetGPSDateTimeUTC write SetGPSDateTimeUTC stored False;
//  GPS tags whose data are rolled into the GPSDataTimeUTC property, so don't display them for the sake of it
    ●property GPSDateStamp: string index ttGPSDateStamp read GetGPSString write SetGPSString stored False;
    ●property GPSTimeStampHour: TExifFraction index 0 read GetGPSTimeStamp write SetGPSTimeStamp stored False;
    ●property GPSTimeStampMinute: TExifFraction index 1 read GetGPSTimeStamp write SetGPSTimeStamp stored False;
    ●property GPSTimeStampSecond: TExifFraction index 2 read GetGPSTimeStamp write SetGPSTimeStamp stored False;
//  thumbnail tags
    ●property ThumbnailOrientation: TExifOrientation index Ord(esThumbnail) read GetOrientation write SetOrientation stored False;
    ●property ThumbnailResolution: TCustomExifResolution read FThumbnailResolution write SetThumbnailResolution stored False;

★ ExifInfo を使用してデータを取得（Delphi のコンポーネントを経由して取得）

「ExifInfo 全データを取得」では以下のデータを取得していますが、追加のデー
タがあれば連絡をお願いします。
取得済みのデータは先頭に「●」を付加しました。

「ソースプログラムの内容」
  StrListExif.Add(EXIF_DATA_0 + #09 + '$9000' + #09 + 'Exif Version');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0000' + #09 + 'GPS Version');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$A000' + #09 + 'FlashPix Version');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$9286' + #09 + 'コメント');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$010F' + #09 + 'メーカー名');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0110' + #09 + '機種名称');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0131' + #09 + 'ソフトウエア');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$8298' + #09 + '著作権者');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$013B' + #09 + '撮影(編集)者');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$9003' + #09 + '撮影日時');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0132' + #09 + '最終編集日時');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0101' + #09 + '画像高 Pixel');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0100' + #09 + '画像幅 Pixel');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$9207' + #09 + '測光モード');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$9208' + #09 + '光源');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$9209' + #09 + 'ストロボ');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$A217' + #09 + 'センサ種別');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$9206' + #09 + '被写体距離(m)');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0012' + #09 + 'GPS 測地系');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$000A' + #09 + 'GPS 測位次元');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0009' + #09 + 'GPS 測位中');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0006' + #09 + 'GPS 高度(m)');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0001' + #09 + 'GPS 緯度');
  StrListExif.Add(EXIF_DATA_0 + #09 + '$0003' + #09 + 'GPS 経度');

「Exif 一覧」
  // TIFF IFD タグ
  Exif_SOI = $FFD8;
  Exif_SOF0 = $FFC0;
  Exif_APP1 = $FFE1;
●Exif_ImageWidth = $0100;
●Exif_ImageLength = $0101;
●Exif_BitsPerSample = $0102;
  Exif_Compression = $0103;
  Exif_Photometric = $0106;
● Exif_Orientation = $0112;
  Exif_SamplesPerPixel = $0115;
  Exif_PlanarConfiguration = $011C;
  Exif_YCbCrSubSampling = $0212;
  Exif_YCbCrPositioning = $0213;
  Exif_XResolution = $011A;
  Exif_YResolution = $011B;
  Exif_ResolutionUnit = $0128;
  Exif_StripOffsets = $0111;
  Exif_RowsPerStrip = $0116;
  Exif_StripByteCounts = $0117;
  Exif_JPEGInterchangeFormat = $0201;
  Exif_JPEGInterchangeFormatLength = $0202;
  Exif_TransferFunction = $012D;
  Exif_WhitePoint = $013E;
  Exif_PrimaryChromaticities = $013F;
  Exif_YCbCrCoefficients = $0211;
  Exif_ReferenceBlackWhite = $0214;
●Exif_DateTime = $0132;
  Exif_ImageDescription = $010E;
●Exif_Make = $010F;
●Exif_Model = $0110;
●Exif_Software = $0131;
●Exif_Artist = $013B;
●Exif_Copyright = $8298;
  Exif_ExifIFDPointer = $8769;
  Exif_GPSInfoIFDPointer = $8825;

  // Exif IFD タグ
●Exif_ExifVersion = $9000;
●Exif_FlashPixVersion = $A000;
  Exif_ColorSpace = $A001;
  Exif_ComponentsConfiguration = $9101;
  Exif_CompressedBitsPerPixel = $9102;
  Exif_PixelXDimension = $A002;
  Exif_PixelYDimension = $A003;
  Exif_MakerNote = $927C;
●Exif_UserComment = $9286;
  Exif_RelatedSoundFile = $A004;
●Exif_DateTimeOriginal = $9003;
●Exif_DateTimeDigitized = $9004;
  Exif_SubSecTime = $9290;
  Exif_SubSecTimeOriginal = $9291;
  Exif_SubSecTimeDigitized = $9292;
  Exif_ExposureTime = $829A;
  Exif_FNumber = $829D;
  Exif_ExposureProgram = $8822;
  Exif_SpectralSensitivity = $8824;
  Exif_ISOSpeedRatings = $8827;
  Exif_OECF = $8828;
  Exif_ShutterSpeedValue = $9201;
  Exif_ApertureValue = $9202;
  Exif_BrightnessValue = $9203;
  Exif_ExposureBiasValue = $9204;
  Exif_MaxApertureValue = $9205;
●Exif_SubjectDistance = $9206;
●Exif_MeteringMode = $9207;
●Exif_LightSource = $9208;
●Exif_Flash = $9209;
  Exif_FocalLength = $920A;
  Exif_FlashEnergy = $A20B;
  Exif_SpatialFrequencyResponse = $A20C;
  Exif_FocalPlaneXResolution = $A20E;
  Exif_FocalPlaneYResolution = $A20F;
  Exif_FocalPlaneResolutionUnit = $A210;
  Exif_SubjectLocation = $A214;
  Exif_ExposureIndex = $A215;
●Exif_SensingMethod = $A217;
  Exif_FileSource = $A300;
  Exif_SceneType = $A301;
  Exif_CFAPattern = $A302;
  Exif_InteroperabilityIFDPointer = $A005;

  // GPS IFD タグ
●Exif_GPSVersionID = $0000;
●Exif_GPSLatitudeRef = $0001;
  Exif_GPSLatitude = $0002;
●Exif_GPSLongitudeRef = $0003;
  Exif_GPSLongitude = $0004;
  Exif_GPSAltitudeRef = $0005;
●Exif_GPSAltitude = $0006;
  Exif_GPSTimeStamp = $0007;
  Exif_GPSSatellites = $0008;
●Exif_GPSStatus = $0009;
●Exif_GPSMeasureMode = $000A;
  Exif_GPSDOP = $000B;
  Exif_GPSSpeedRef = $000C;
  Exif_GPSSpeed = $000D;
  Exif_GPSTrackRef = $000E;
  Exif_GPSTrack = $000F;
  Exif_GPSImgDirectionRef = $0010;
  Exif_GPSImgDirection = $0011;
●Exif_GPSMapDatum = $0012;
  Exif_GPSDestLatitudeRef = $0013;
  Exif_GPSDestLatitude = $0014;
  Exif_GPSDestLongitudeRef = $0015;
  Exif_GPSDestLongitude = $0016;
  Exif_GPSDestBearingRef = $0017;
  Exif_GPSDestBearing = $0018;
  Exif_GPSDestDistanceRef = $0019;
  Exif_GPSDestDistance = $001A;

  // Interoperability IFD タグ
  Exif_InteroperabilityIndex = $0001;
  Exif_InteroperabilityVersion = $0002;
  Exif_RelatedImageFileFormat = $1000;
  Exif_RelatedImageWidth = $1001;
  Exif_RelatedImageLength = $1002;

★ファイルのプロパティを取得（エクスプローラのプロパティと同じ内容）

Windows の機能を使用して取得しています。

■15 謝辞

	▼	Exif情報の表示では、以下のサイトの情報を活用させていただきました。
		ありがとうございました。

	▼	「遠雷」様のサイトの「Exif読取り君」
		http://enrai.matrix.jp/exif.html

	▼	「かみさか」様のサイト「JpegAnalyzer Plus」
		http://hp.vector.co.jp/authors/VA032610/

	▼	「みず」様のサイト
		http://fow.minim.ne.jp/compo/exifinfo.html

