ルモーリン
ホーム 更新 Perl Sample サービス 雑談 鉄ゲタ Linux リンク 連絡先

デジカメの写真をデスクトップに転送したい

投稿:2021-11-15

机上の色々を5万円のデジカメで撮影してPCからツイートする都合でデジカメの写真を手間なく転送したい。

  1. デジカメで撮影すると内蔵したWi-Fi付きSDカードに保存されます。
  2. SDカード内蔵のLuaスクリプトがPCへFTP転送します。
  3. PCは追加された画像ファイルをImageMagickでリサイズと撮影方向を調整します。

東芝のFlashAirはWi-FiとLuaスクリプトの処理系を内蔵したSDカードです。もう生産終了しています。
Amazon.co.jp: flashair

FlashAir用の設定ツールを使い初期化するとSDカードの/SD_WLAN/CONFIGに設定内容が保存されます。 CONFIGファイルを修正、保存すれば設定変更になります。 デフォルトの設定ではAPモード(親機)なのでSTAモード(子機)に変更してWi-Fiルータにアクセスできるようにしますから、APPMODEを5にします。 STAモードで出番がない機能を殺すために、DNSMODE、HTTPDBUFF、WEBDAVを追加しましたがなくても影響ないと思うおまじないです。 最後に次項のLuaスクリプトを指定するためLUA_SD_EVENTを追加しました。 エントリが探しにくいのでアルファベット順に並べ直してあります。

[Vendor]

APPAUTOTIME=300000
APPMODE=5
APPNETWORKKEY=<親機のパスワード>
APPSSID=<親機の名前>
CID=02544d535736344755f043097a011401
CIPATH=/DCIM/100__TSB/FA000001.JPG
DNSMODE=0
HTTPDBUFF=2920
LOCK=1
LUA_SD_EVENT=/SD_WLAN/upload_photo.lua
PRODUCT=FlashAir
TIMEZONE=36
VERSION=F15DBW3BW4.00.04
WEBDAV=0

デジカメがSDカードに写真を保存するとLUA_SD_EVENTが指定したスクリプト(upload_photo.lua)が起動します。 私のデジカメでは/DCIM/101CASIOに保存されるので、そのフォルダを検索して見つけたファイルが今保存した奴だろうということです。 Luaの処理系にFTPが入っているのでこれでサーバーへアップロードし3秒後に画像を削除します。 デジカメのプレビューを使うと撮影したのに削除された状態に対応できずエラーが出ます。

fpath = "/DCIM/101CASIO"
host = "<FlashAirのIPアドレス>"
user = "<FTPのユーザーID>"
password = "<FTPのパスワード>"
url_base = "ftp://" .. user .. ":" .. password .. "@" .. host .. "/"

for filename in lfs.dir(fpath) do
  file_path = fpath .. "/" .. filename
  fa.ftp("put", url_base .. filename, file_path)
  sleep(3000)
  fa.remove(file_path)
end

Luaスクリプトの設定の都合やFTPサーバーが予定のIPアドレスだけに許可できるようFlashAirのIPアドレスを固定化します。 自宅のルーターにはDHCPの他に固定IPアドレスの設定がありFlashAirのMACアドレスを調べてそのMACアドレスの場合は固定IPアドレスを割り当てるようにします。 この辺りはルーターによるので各自頑張ってください(笑)。 こうしておくと他の端末はMACアドレスが別なので固定IPアドレスが割り当てられず、固定IPアドレスの持ち主はFlashAirだけになります。

ウチのPCはWindows10なので、FTPサーバーが内蔵されています。 メニューのWindows管理プログラムからインターネットインフォメーションサービス(IIS)マネージャーを開いてFTPサイトを追加します。 IPアドレスの制限でFlashAirのIPアドレスだけに絞ります。 リモートのフォルダは自分のデスクトップにします。 ユーザーはFlashAir専用のユーザーを作りますがその前にWindowsのユーザーとして登録します。 このユーザーをFTPのユーザーとしても登録し、デスクトップに読み書きできるよう設定します。 自分とFlashAir専用のユーザーは別のユーザーですから私のフォルダを別のユーザーがアクセスできるようにすることに注意してください。

上記の準備があれば、デジカメで撮影するとデスクトップに写真が転送されます。 けれども、写真の解像度が大きすぎてツイッターやホームページに掲載するには解像度を下げることが必要です。 デジカメの低解像度は綺麗でないため、高解像度のまま転送しパソコンで綺麗に解像度を下げます。 そのためにはデスクトップに写真が置かれるのを監視、置かれた直後に解像度を下げる処理を開始しなくてはなりません。 Windows10には、このような見張り番をさせるのにぴったりな監査という機能があります。 デスクトップのプロパティで、セキュリティにFlashAirのユーザーを追加、詳細設定の監査で監査エントリを追加します。 なお高度な設定で「ファイルの作成/データの書き込み」をチェックしてください。 普通の設定(?)の「書き込み」では上手く行きませんでした(原因不明)。 適用先は「このフォルダーとファイル」です。 これでFlashAirのユーザー(実際はFTPサーバー)がデスクトップに写真を置くと監視イベントが発生します。

前述の監視イベントが発生したら解像度を下げるプログラムを起動します。 タスクスケジューラでタスクを作りトリガをカスタムに設定、イベントフィルターを次のようにします。 しかしながら出てくる名前やイベントIDはPC毎に異なりますから実際に写真が転送された際のイベントログを参照してください。

<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and Level=0 and EventID=4663]][EventData [Data[@Name='SubjectLogonId']=999]]</Select>
  </Query>
</QueryList>

解像度を下げてくれれば何でも良いのでバッチファイルやネットにあるツールを組み合わせても差し支えありません。 起動した時点では転送されたファイルがどれか分からないので、デスクトップにあるjpgファイルの中から更新後10秒以内、ファイルサイズ300KB以上の物を探します。 対象の写真が見つかれば、画像変換ソフトImageMagickのスタンドアロン版magickで解像度を下げます。 このソフトは写真の縦横を自動判定して向きを変える機能があるのでついでにやってもらいます。

# 写真のフォルダ
$photo = "C:\Users\<自分のユーザーID>\Desktop\";

# 直近秒数
$update_check = 10;

# サイズ
$size_check = 300000;

# 写真の一覧
$itemList = Get-ChildItem($photo + "*.jpg");

foreach ($item in $itemList) {
	# 更新後の秒数
	$update = ((Get-Date) - $item.LastWriteTime).TotalSeconds

	# 更新とファイルサイズで絞り込む
	if ($update -lt $update_check -and $size_check -lt $item.Length) {
		# 書き替え、リサイズ、方向調整、最適化
		$magick_arg = @("mogrify", "-resize", "640x480", "-auto-orient", "-quality", "95", $item);
		Start-Process -FilePath magick.exe -ArgumentList $magick_arg -WindowStyle Minimized -Wait
	}
}