スマホで写真を撮ったものをパソコン(windows 10)でよく使うことがあり、Microsoft の OneDrive を使い自動でPCと同期できるようにしていたが、最近のスマホは高画質で容量も大きいため、毎回縮小ソフトを使って縮小してから使用していた。
この手間を自動化して写真ファイルを使いたいと思った時に既に縮小されているようにしようと思い、自動化を思い立った。
流れとしては
- スマホで写真を撮る
- スマホアプリ「OneDrive」が自動でPC 側のカメラロールフォルダにアップロード。
- アップロードされたファイルを「フォルダ監視」というフリーソフトを使って検知。
- 「フォルダ監視」がバッチを実行。
- 特定のフォルダにアップロードされた写真がコピーされる。(バッチ内で自動処理)
- コピーされた写真はバッチ処理ができる「IrfanView」で縮小される。(バッチ内で自動処理)
- リサイズされた写真は自動削除(バッチ内で自動処理)
フォルダを監視してプログラムを起動する方法についての使い方はこちらを参考にした。
IrfanViewでバッチ処理を行う方法はこちらを参考にした。
つまずいた点は、「IrfanView」が日本語フォルダを扱えなかったこと。
OneDrive では「カメラロール」という日本語のフォルダに自動で強制的に同期される。
そのため、一度バッチ処理で特定のフォルダに写真ファイルをコピーすることが必要だった。
その処理はバッチ内でrobocopyコマンドを使っておこなった。
robocopyの使い方についてはこちらを参考にした。
また、フルパスを記入する時に文字化けに注意する必要があった。
sublime text3をよく使っているが、文字化けになってしまいうまくいかなかった。
そこで、メモ帳でプログラムを書いてANSIで保管する必要があった。
また、カメラロールフォルダはデフォルトでカメラとロールの間にスペースが入っているためダブルクォーテーションでまとめる必要もあった。
リサイズされたファイルはもともと「カメラロール」フォルダに原本はあるため、自動削除したほうが手間いらず。
なので、forfilesコマンドを使い、変換されたjpg,pngファイルは削除されるようにした。
forfilesコマンドについてはこちらを参考にした。
ソースコードの参考をここに記載しておく。
@echo off rem ワンドライブの同期フォルダフルパス set onedrive=C:\Users\user\OneDrive\画像\カメラ ロール rem ワンドライブの写真のコピー先 set CopyDestination=C:\Users\user\Pictures\camera rem IrfanViewのプログラムをフルパスで表示(.exeは省略可) set IrfanView=C:\Program Files\IrfanView\i_view64 rem リサイズ後の画像ファイル出力先 set output=C:\Users\user\Pictures\camera\Irfanview_auto_resize\ robocopy "%onedrive%" %CopyDestination% *.jpg *.png *.jpeg *.mp4 *.mov /z /xo /s "%IrfanView%" %CopyDestination%\*.jpg /resize_long=800 /aspectratio /resample /convert=%output%*.jpg "%IrfanView%" %CopyDestination%\*.png /resize_long=800 /aspectratio /resample /convert=%output%*.png forfiles /P %CopyDestination% /M "*.jpg" /C "cmd /C del /Q @file" forfiles /P %CopyDestination% /M "*.png" /C "cmd /C del /Q @file"