午前三時の港町

理系院生(半導体)→コンサルティングファーム。IT基盤側。エクセルとパワーポイントしか使っていないため技術力はお察し。本やゲームの感想や学習記録など付ける予定。記載内容は個人の責任で、所属組織を代表するものではありません。

Pythonを使ってWindowsSpotlight(ロック画面)の画像取得

【目的・背景】
Windowsロック画面に表示される画像を保存してデスクトップ背景のスライドショーにしたかった。
Microsoft StoreのアプリがPCで制限されている関係で、SpotBrightは使用不可、バッチファイルで画像取得まで完了済み
③コピーしてきたファイルには目的の解像度以外の画像データも含まれているため、これを削除したい。

【バッチファイル】

rem コピー元アドレスセット
set copy_from=C:\Users\%USERNAME%\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets
rem コピー先アドレスセット
set copy_to=C:\Users\%USERNAME%\Desktop\Assets
rem ディレクトリコピー
echo D | xcopy %copy_from% %copy_to% /Y
rem 怖いのでディレクトリ移動
cd C:\Users\%USERNAME%\Desktop\Assets
rem ファイル名変更
ren * *.jpg

Python
PILを使用する。コードは次の通り

import os
import subprocess
import PIL.Image as img

#既成のバッチファイル呼び出し(画像取得)
os.system("kabegami.bat")

#ユーザーホーム取得
user = os.environ.get("USERPROFILE")
print(user)

#ファイルリスト取得
filelist =os.listdir(user+"/Desktop/Assets")
print(filelist)
os.chdir(user+"/Desktop/Assets")

#各ファイル毎の処理
#削除条件に合致したものを削除
for file in filelist:
    try:
        im = img.open(user+"/Desktop/Assets/"+file)
        if im.size[0] == 1920: 
            im.close()
            print("Pass")
        else:#解像度が1920*でない物を削除
            im.close()
            print("Image_size_delete")
            os.remove(user+"/Desktop/Assets/"+file)
    except:#画像として認識できない物等を削除
        print("exception_delete")
        os.remove(user+"/Desktop/Assets/"+file)

【運用】
①kabegami.batとspotlight.pyは同一ディレクトリに格納し、spotlight.pyを実行するだけ

Before(kabegami.batのみ)
f:id:rarefox45:20180302210431j:plain

After(spotlight.py実行)
f:id:rarefox45:20180302210449j:plain

やったぜ

【今後】
移動した後にもう一度バッチファイルを実行するなどして、既にある名称のファイルを持ってきた場合に問題が起こる。
ファイルのリネームが上手く行われず、拡張子がないファイルが残ってしまうのだ。
該当の拡張子がないファイルはimage.open()で開けてしまうので、今回作成したコードでは削除できない。
この問題へのアプローチとして「拡張子のないファイルを削除する」という条件を正規表現を使って追加しようと思ったが、30分程度で一旦挫折。
思えば、JavaJavaしてたときも正規表現は賢く使えていなかった。
今後の課題としてPython正規表現使った記法を一通りやってみたいと思う(やるとは言っていない)。