見出し画像

VRChatの写真にPNGファイルのまま撮影日時を付与したい(※不要になりました)

(サムネイル:時の残響-Echoes of Time

2025/05/07:おまけにいくつか処理を追加(2-1, 2-2)
2025/06/01:タイトルがめちゃ長だったのでちょっと短めに修正
2025/09/16:いつのまにかこんなことしなくて良くなってました


PNGファイルへ撮影日時を埋め込む処理についてまとめました。
ついでに処理のbatファイル化についてもまとめています。
先駆者がいたらすみません・・・

2025/09/16 追記
いつの間にか、VRChatがネイティブでメタデータ埋め込みをするようになったらしく、日時埋め込みを個別で行う必要はなくなったみたいです。

つまりこのnoteはもういらない子です!
まさか半年経たずに無意味になるとはね…
折角書いたnoteなんで消したりはしない予定です。
あまり役には立たないかもしれませんが…


※絶対読んでね※

VRChatの写真に最初から日時データが埋め込まれるようになったので、VRChatterには全く意味のないnoteになりました。
とった写真を、そのままAmazon PhotosなりGoogle Photoなりにぶちこめば、日時順で並んでくれます。
それ以外でPNGに日時データを埋め込みたい人にとっては、少しだけ役に立つかもしれません。

そんな記事です。暇だったら見てってください。


経緯

無限に増殖していくVRChatの写真を、皆さんはどのように管理していますか?
私は普段、AmazonPhotosにアップロードして管理しています。
そのままアップロードすると日付なしと判断されてしまうため、撮影日時を埋め込んでからアップロードしているのですが、
これまでは先人の知恵をお借りして

  1. PNGからTIFFに変換

  2. 撮影日時を埋め込み

  3. アップロード

という手順を取っていました。
(以下の記事を参考にしていました。感謝…)

しかし上記の方法は、自分の環境では不都合な部分がいくつかありました。
具体的には

  • スマホがTIFFファイルにネイティブで対応していない

  • 貰った写真が全て同じ撮影日時になってしまう

1つ目について
私はAndroidを使っているのですが、TIFFファイルを端末に保存した場合、専用のビューワを使わないと写真を見ることができません。
AmazonPhotos上の表示は割とショボいので、ダウンロードしてオリジナルの画質で確認したいことがあるのですが、そのためだけに専用のビューワを用意するのはちょっと面倒です。

2つ目について
上の記事のやり方では、画像の更新日を撮影日時として埋め込む方法がとられていました。
しかし、zipファイルなどでまとめて写真を渡された場合、解凍した時間が更新日になるため、そこから撮影日時を埋め込むと全部同じになってしまいます。
AmazonPhotosの仕様上、同じ日時の写真は毎回場所が入れ替わるため、これが割と致命的でした。

そんなわけで何かいい方法はないか探していたのですが、どうやら最近のPNGは撮影日時の埋め込みができるらしい、ということが分かりました。
撮影日時の衝突についても、良さそうな解決策が見つかりました。
それならば試してみるしかありません。


【補足】今まで変換が必要だった理由

→ PNGの旧仕様では、eXIfチャンクをサポートしていなかったため

AmazonPhotosでは、EXIFデータ内の撮影日時を参照してソートしています。
2017年以前のPNGは、eXIfチャンクをサポートしていなかったため、撮影日時が埋め込めませんでした。
またeXIfチャンク対応後も、アプリ側が未対応のためPNGの撮影日時を参照してくれなかった(らしい)。
以下の記事が分かりやすかったです。

PNGがeXIf対応し、AmazonPhotosもそれを参照してくれる今だからこそ、今回の方法が可能になったということです。多分。


手順

前置きが長くなってしまいましたが、始めて行きましょう。
おおまかな流れは以下のような感じです。
1. ExifToolの準備
2. 撮影日時の埋め込み処理をするbatファイルの作成
3. 写真をAmazonPhotosへアップロード

①ExifToolの準備

  1. 公式サイトからダウンロード

  2. zipファイルを解凍後、"exiftool(-k).exe"を"exiftool.exe"にリネーム

  3. "exiftool_files"フォルダと"exiftool.exe"を、PATHの通っているディレクトリに配置(batファイルでPATHに追加する場合、この操作は不要)

②batファイルの作成

埋め込みを手作業でやっていては日が暮れてしまうので、batファイルで処理を自動化してみます。

メモ帳を開き、以下のコードをコピー&ペーストしてください。

@echo off
setlocal enabledelayedexpansion

rem カレントディレクトリのPNGファイルのみ処理
for %%i in (*.png) do (
	
	rem ファイル名を抽出
	set filename=%%~nxi
	
	rem ファイル名からタイムスタンプを抽出
	set year=!filename:~7,4!
	set month=!filename:~12,2!
	set day=!filename:~15,2!
	set hour=!filename:~18,2!
	set min=!filename:~21,2!
	set sec=!filename:~24,2!
	
	rem 埋め込む撮影日時を作成
	set dateTime=!year!:!month!:!day! !hour!:!min!:!sec!
	
	rem 撮影日時を埋め込む
	exiftool -EXIF:DateTimeOriginal="!dateTime!" -overwrite_original !filename!
)

echo;
echo 処理が完了しました
echo;

pause

endlocal

メモ帳は任意の場所に保存し、拡張子を *.txt から *.bat に変更しておいてください。
名前はなんでもOKです。( * の部分)
バックアップが作成したい場合はおまけを参照。

batファイルの使い方

batファイルを写真があるフォルダに配置してください。

今回はお試しなので4枚だけ

実行後はこんな感じになるかと思います。
枚数が多い場合は結構時間がかかるので、気長に待ちましょう。

実行後の様子

これで撮影日時の埋め込みが完了しました。

③AmazonPhotosにアップロード

AmazonPhotosにアップロードし、撮影日時の埋め込みが成功しているか確認しましょう。
これまた枚数が多いと相当な時間がかかります。
耐えてください。

ちゃんと撮影日時順で並んでいます
写真の情報で撮影日時が埋め込まれていることが確認できます

これでおしまいです。
お疲れさまでした。

※注意点※

ファイル名から埋め込む撮影日時を抽出しているため、リネームしているとうまくいかなくなる可能性が大きいです。
リネームは処理実施後に行ってください。


おまけなど

1. バックアップを作成する

埋め込み処理の前に、オリジナルデータを残しておきたいという人向け。

@echo off
setlocal enabledelayedexpansion

rem カレントディレクトリのPNGファイルを、backupフォルダにコピー
robocopy .\ .\backup *.png /XN /NJH /NJS

rem カレントフォルダのPNGファイルのみ処理
for %%i in (*.png) do (
	
	rem ファイル名を抽出
	set filename=%%~nxi
	
	rem ファイル名からタイムスタンプを抽出
	set year=!filename:~7,4!
	set month=!filename:~12,2!
	set day=!filename:~15,2!
	set hour=!filename:~18,2!
	set min=!filename:~21,2!
	set sec=!filename:~24,2!
	
	rem 埋め込む撮影日時を作成
	set dateTime=!year!:!month!:!day! !hour!:!min!:!sec!
	
	rem 撮影日時を埋め込む
	exiftool -EXIF:DateTimeOriginal="!dateTime!" -overwrite_original !filename!
)

echo;
echo 処理が完了しました
echo;

pause

endlocal

【簡単な説明】
フォルダ内にある写真をbackupフォルダにコピー後、処理を開始します。
フォルダは、batファイルのあるフォルダ内に自動で作成されるため、事前に作っておく必要はありません。
/XNで上書きを防止し、/NJH /NJSで不要なログを非表示にしています。
当然ですが、バックアップには撮影日時は埋め込まれていません。

※※注意※※
圧縮などは特に行わないため、単純に容量が2倍必要になります。
容量に余裕があるか確認してから実行してください。

2-1. 処理完了までの残り枚数を表示する

※ 2025/05/07 追加
900枚ぐらい処理させた際、いつ終わるか分からず割と困ったので作成。

@echo off
setlocal enabledelayedexpansion

rem 写真の枚数を取得
for /f %%i in ('dir *.png /A-D /B ^| find /c /v ""') do set fileNum=%%i

rem カレントフォルダのPNGファイルのみ処理
for %%i in (*.png) do (
	
	rem ファイル名を抽出
	set filename=%%~nxi
	
	rem ファイル名からタイムスタンプを抽出
	set year=!filename:~7,4!
	set month=!filename:~12,2!
	set day=!filename:~15,2!
	set hour=!filename:~18,2!
	set min=!filename:~21,2!
	set sec=!filename:~24,2!
	
	rem 埋め込む撮影日時を作成
	set dateTime=!year!:!month!:!day! !hour!:!min!:!sec!
	
	rem 撮影日時を埋め込む
	exiftool -EXIF:DateTimeOriginal="!dateTime!" -overwrite_original !filename!
	
	set /a sum=sum+1
	set str=!sum! / %fileNum%
	
	echo !str!
)

echo;
echo 処理が完了しました
echo;

pause

endlocal

バックアップもしたい場合
バックアップも一緒にしたい場合は、写真の枚数を取得する部分の前にバックアップ処理を入れてください。
以下のような感じです。

@echo off
setlocal enabledelayedexpansion

rem カレントディレクトリのPNGファイルを、backupフォルダにコピー
robocopy .\ .\backup *.png /XN /NJH /NJS

rem 写真の枚数を取得
for /f %%i in ('dir *.png /A-D /B ^| find /c /v ""') do set fileNum=%%i


2-2. 実行するか確認する

※ 2025/05/07 追加
2-1の内容から更に追加。
写真の枚数表示と、実行の最終確認をするように変更。

@echo off
setlocal enabledelayedexpansion

rem 写真の枚数を取得
for /f %%i in ('dir *.png /A-D /B ^| find /c /v ""') do set fileNum=%%i

echo %fileNum% 枚の写真があります

set /p ans="処理実行しますか? (y/n) > "
echo;

if /i %ans%==y (
	echo 処理実行します
) else (
	echo 処理中断します
	pause
	exit
)

PNGファイルの処理部分は2-1と同じなので割愛します。
バックアップ処理を追加する場合も、2-1を参考にしてください。


おしまい

というわけで、今回はVRChatの写真に撮影日時を埋め込む処理の、簡単な解説を書いてみました。
まともに文章を書いたのが初めてなので、おかしな部分があったらすみません。
何かありましたら、コメントでご連絡ください。

それでは皆様、よいVRChatライフを

いいなと思ったら応援しよう!