Nurse Love Addiction

Nurse Love Addiction

Not enough ratings
白愛の スクリーンショットを Steam で管理したい
By bravehearts623
Windows の標準機能である ゲームバー DVR でキャプチャした画像を Steam で管理できるようにするスクリプトを紹介します。
PNG-JPEG変換してリネームしてファイル移動、面倒な操作はこれひとつ。
   
Award
Favorite
Favorited
Unfavorite
はじめに
白衣性愛情依存症に限らずオーバーレイが機能しないゲームでは Steam によるスクリーンショット保存ができません。
(私は alt + app にしていますが、デフォルトでは F12 でしたっけ?)
そんなときに便利なのが Windows の標準機能であるゲームバーのキャプチャですが、ただ、こいつは PNG 形式での保存になってしまうのでそのままではアクティビティに投稿したりはできません。
jpeg に変換して、必要ならリネームして、Steam のスクショフォルダに移動という操作が必要で、とても面倒です。
退屈なことはPython にやらせよう、ということでこれらを自動で行うスクリプトを作りました。

コードは Gist[gist.github.com] で管理しています。
実行方法
実行するには5つの引数を指定します。
実行文例
python screenshotArrangement.py path1 path2 format1 format2 -d
  • 一つ目の引数は DVR 保存フォルダです、デフォルトでは %USERPROFILE% / Videos / Capturesになります。
  • 二つ目の引数は変換後の画像を保存する場所です。※1
  • 三つ目の引数は変換対象のファイル拡張子を指定します。通常は 'png' です。
  • 四つ目の引数は変換後の拡張子です。通常は'jpg'です。
  • 五つ目の引数は変換が終わったファイルを削除するかどうか。削除する場合は'-d' 削除しない場合は省略します。

※1 移動も自動で OK みたいなことを言いましたが、残念なことにこのスクリプトでは完全な自動化ができるようにはなっていません。キャプチャフォルダの画像は一緒くたに処理するからです。
キャプチャフォルダのファイル一覧を取得する際にうまくフィルタリングするか、変換時に保存先を自動判別するように改修する必要があります。
白愛以外のゲームでも必要になったら作ります。
コード
#! python3 # screenshotArrangement # encoding: UTF-8 from pathlib import Path #パス操作 from pathlib import PurePath from PIL import Image # 画像変換用モジュール import time import glob, os, sys # ファイルパス, コマンドライン引数を使用するので ### # Main # def main(): # コマンドライン引数のパーサー import argparse parser = argparse.ArgumentParser( description='Convert screenshots captured by Windows VDR to Steam screenshots.', prog='screenshotArrangement.py', usage='python screenshotArrangement.py src save_directory source_format convert_format [--delete]' ) parser.add_argument('pathOrig', help='Input file path') parser.add_argument('save_dir', help='Output file path') parser.add_argument('formatOrig', help='Input format') parser.add_argument('formatConv', help='Output format') parser.add_argument('-d', '--delete', help='delete input file', action='store_true') # store_true のときは初期値false, store_false のときは初期値true になるらしい args = parser.parse_args( ) #対象ディレクトリの対象ファイルの一覧を取得 files = listup_files(args.pathOrig, args.formatOrig) i = 0 if args.delete: print('-d オプションが指定されています。入力ファイルを削除します。') for f in files: print(i, f.name) result = convert(f, args.save_dir, args.formatConv) # _vr のダミーを作成。作成に失敗すると dummy = link(result) # スクリーンショットの作成日時にするため、オリジナルの作成日時をコピーする mtime = os.stat(f).st_mtime os.utime(result, (mtime, mtime)) # -d オプションがあれば入力ファイルを削除 if args.delete: try: os.remove(f) except OSError as e: print(' e: [{0}] msg: [{1}]'.format(e.errno, e.strerror), file=sys.stdout) i = i + 1 ### # listup_files() # def listup_files(path, format): """ listup_files(path, format) Parameters ------- path : string ディレクトリ一覧を取得する対象 format : string 指定した拡張子の一覧を取得 """ # ディレクトリ一覧を取得 p = Path(path) # GDRで保存された PNG ファイルの一覧を取得 # Path.glob(pattern)はジェネレータを返す。結果を明示するためlist化しているが、普段は不要。 format = "*." + format return list(p.glob(format)) ### # convert() # def convert(src, save_dir, format): """ convert(src, save_dir, format) parameters -------- src : string 変換対象のファイルのパス save_dir: string 変換後のファイルを置くディレクトリのパス。Screenshots フォルダを指定するはず。 format: string 変換後のファイル形式 return -------- savepath : string 変換後のファイルの完全なパスを返します。 """ try: img = Image.open(src, 'r') except Exception as e: print(' e: [{0}] msg: [{1}]'.format(e.errno, e.strerror), file=sys.stdout) else: width, height = img.size # 画像を貼り付けるキャンバスを作成して貼り付け canvas = Image.new("RGB", (width, height), (255, 255, 255)) canvas.paste(img, (0, 0)) # 20180630_201030.jpg のような名前で保存 filename = filenameFormat(src) + '.' + format savepath = os.path.join(save_dir, filename) # 画像の保存 canvas.save(savepath, returnFormat(format), quality=95, optimize=True) # TODO quality は args で指定してもいいかも return savepath ### # link(src) # def link(src): p = PurePath(src) dst = p.with_name(p.stem + '_vr' + p.suffix) try: os.symlink(src, dst) except OSError as e: print(' e: [{0}] msg: [{1}] シンボリックリンクを作成する権限がありません。リンクを作成するには管理者として実行して下さい。' .format(e.errno, e.strerror), file=sys.stdout) except FileExistsError as e: print(' e: [{0}] msg: [{1}] すでに存在するファイルを作成することはできません。' .format(e.errno, e.strerror), file=sys.stdout) else: return dst ### # filenameFormat() # def filenameFormat(path): # DVRで保存した画像のファイル名は以下のようになる # ゲーム名 2018_06_29 13_31_00.png # 時間は0埋めしない二桁で表される。ファイル名を再利用しようとすると分岐が大変 # stat から生成の方が楽だった。 p = Path(path) mtime = time.localtime(os.stat(p).st_mtime) filename = time.strftime('%Y%m%d_%H%M%S', mtime) return filename ### # returnFormat() # 渡されたフォーマットを大文字で返す # def returnFormat(format): if format == "bmp": return "BMP" elif format == "jpg": return "JPEG" elif format == "png": return "PNG" elif format == "gif": return "GIF" else: print(format + " は対応していません。") sys.exit() if __name__ == "__main__": main()