【Python】スクショを1秒でWebP変換!自動リサイズ常駐ツール | ss_to_webp

Pythonでブログ画像編集を自動化するツールの紹介。左側に苦労する編集作業、右側にPythonロゴと自動生成されたWebP画像が並ぶ比較図

🌏 English Edition is available here

記事1本に1時間……その半分が「画像処理」に使われていませんか?

ブログを書くのは楽しい。

でも、記事にスクリーンショットなどを張り付けようとすると、**「画像のリサイズ」と「WebP変換」**が必要ですよね。たとえそれが画像一つの作業であっても……正直、苦行ですよね。

記事1本に1時間……その半分が「画像処理」に使われていませんか? 1枚3分の作業でも、10枚あれば30分。100記事書けば50時間。 その時間を「執筆」に使えたら、もう1本渾身の記事が書けますよね。

スクショ張り付けステップを書き出すと以下になりますね。

  1. スクショを撮る
  2. ペイントや編集ソフトで開く
  3. 横幅をブログ用にリサイズする
  4. WebP形式で書き出す
  5. フォルダを整理する

これが記事1本につき5回、10回と繰り返すことに。こんな「単純作業」に貴重な時間を費やしたく…ねぇなぁ…。

集中力は有限だし、最大限執筆時間に神経を注ぎ込みたいですよね。

正直、41歳でAIエンジニアを目指すと決めた時、一番の敵は「時間」だった。
若い世代に追いつくためには、1秒でも長くコードを書き、思考を深める必要がある。

それなのに、スクショを撮るたびに編集ソフトを開き、同じ数値を打ち込んでリサイズする……。
この「脳のスイッチを切り替えるコスト」が、俺の学習と執筆の最大のボトルネック(障害)になっていたんだ。

「画像が重いとSEOに悪い。でも手間はかけたくない。」

エンジニアとして、**「同じ作業を3回繰り返したら自動化しろ」**という教えがある。AIエンジニア志望として、この悩みは『コード』で解決しましょう。


PrintScreenを押すだけ。3サイズのWebPが自動生成される世界へ

今回紹介する自作ツール ss_to_webp.pyw を導入すると、ブロガーの執筆環境はこう変わります。

「PrintScreenキーを叩く。以上。」

これだけで、クリップボードにある画像が以下の3つの最適化済みWebPとして、一瞬で専用フォルダに保存される。

  • Original: 撮ったままのフルサイズ(バックアップ用)
  • Thumb (1200px): PCブログ記事のメイン用
  • Article (800px): スマホ閲覧やSNSシェアに最適な軽量版

リサイズ目的で編集ソフトを開く必要すらありません。

動的な「アスペクト比保持」と「条件付きリサイズ」: > 単に固定サイズに潰すのではない。元の画像サイズを判定し、指定幅より小さい場合は拡大せず、アスペクト比を維持したまま最適化するロジックを組んだ。 「不必要な計算リソースを消費せず、画質を担保する」。この小さなこだわりが、長期的なブログ運営のパフォーマンス(SEO)を支える「エンジニアの設計思想」なんだ。


【実証】ss_to_webp.pyw の仕組みと全コード公開

このツールは、Pythonの強力なライブラリを組み合わせて「常駐型オートメーション」を実現しています。

技術的なこだわりポイント

  • pynput によるキー監視: 特定のホットキー(PrintScreen)をバックグラウンドで待ち受けます。
  • Pillow (Image.LANCZOS): 単なる縮小ではなく、文字の輪郭がボケにくい高品質なスケーリングアルゴリズムを採用しました。
  • .pyw によるステルス動作: 実行時に黒いコンソール画面を出さず、作業の邪魔をしないスマートな仕様です。

このツールを動かすには、以下の外部ライブラリが必要です。ターミナル(コマンドプロンプト)でサクッとインストールしておきましょう。

Bash

pip install Pillow pynput

Python

# -*- coding: utf-8 -*-
"""
Screenshot to WebP Converter (ss_to_webp)
Author: Eishi Giken (ask-asuka-tech.tech)
Description: Automatically resizes and converts screenshots to WebP format.
License: MIT
"""

import os
import datetime
import time
from PIL import Image, ImageGrab
from pynput import keyboard

# --- 設定:保存先 ---
# 実行したユーザーのデスクトップに自動で「ScreenShot_dev」フォルダを作成する
BASE_DIR = os.path.join(os.path.expanduser("~"), "Desktop", "ScreenShot_dev")

# 生成したいサイズ設定 { "フォルダ名": 横幅(px) }
TARGET_SIZES = {
    "original": None,
    "thumb": 1200,
    "article": 800
}

def prepare_folders():
    """実行時に必要なフォルダをすべて作成する"""
    for name in TARGET_SIZES.keys():
        path = os.path.join(BASE_DIR, name)
        if not os.path.exists(path):
            os.makedirs(path, exist_ok=True)
            print(f"Directory created: {path}")

def save_multi_screenshots():
    """クリップボードから画像を取得し、各サイズでWebP保存する"""
    # OSの書き込みラグを考慮し、わずかに待機
    time.sleep(0.3)
    
    try:
        img = ImageGrab.grabclipboard()
        
        # クリップボードの中身がImageオブジェクトであることを確認
        if isinstance(img, Image.Image):
            timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
            
            for name, width in TARGET_SIZES.items():
                save_path = os.path.join(BASE_DIR, name, f"ss_{timestamp}_{name}.webp")
                
                # リサイズ処理(指定幅より大きい場合のみLANCZOSで縮小)
                if width and img.size[0] > width:
                    w_percent = (width / float(img.size[0]))
                    h_size = int((float(img.size[1]) * float(w_percent)))
                    resized_img = img.resize((width, h_size), Image.LANCZOS)
                    resized_img.save(save_path, "WEBP", quality=85)
                else:
                    img.save(save_path, "WEBP", quality=85)
                    
            print(f"Success! Saved 3 sizes at [{timestamp}]")
        else:
            print("Notice: No image found in clipboard.")
            
    except Exception as e:
        print(f"Error during processing: {e}")

def on_press(key):
    """キー入力を検知(PrintScreenキー)"""
    if key == keyboard.Key.print_screen:
        save_multi_screenshots()

def main():
    """メイン実行ループ"""
    prepare_folders()
    print("-" * 50)
    print(f"[Monitoring...] Target: {BASE_DIR}")
    print("Press 'PrintScreen' to save images as WebP.")
    print("To stop, press Ctrl+C in this window.")
    print("-" * 50)

    try:
        with keyboard.Listener(on_press=on_press) as listener:
            listener.join()
    except KeyboardInterrupt:
        print("\nStopping monitoring...")

if __name__ == "__main__":
    main()

ソースコードをGitHubで公開しました

ブロガーの皆さんがすぐに自分の環境で試せるよう、ソースコード一式をGitHubリポジトリにアップロードしました。スター(Star)をいただけると、41歳新米エンジニアの励みになります!

🔗 wisdom-kojuroh / ss_to_webp (GitHub)

画像処理のストレスが消え、書くことだけに集中できる未来

このツールを導入してから、俺のブログ執筆時間は体感で30%以上短縮されました。

何より、「画像を加工しなきゃ」という心理的なハードルが消えたことが最大の収穫です。AIエンジニアを目指す者として、日常の小さな不便を技術で解決する。

これが俺の、そしてこのブログ 「Ask-Asuka Tech(叡志技研)」 の第一歩。

🌍 Global Developer’s Guide (Strategic Overview)

Automated WebP Workflow for Tech Bloggers

  • The Core Problem: Linear workflows in image processing create a cognitive load that kills a developer’s deep work.
  • The Engineering Edge: Unlike generic tools, ss_to_webp.pyw implements conditional execution logic. It skips redundant processing if the source is already optimized, ensuring a high-performance output with zero-touch automation.
  • The Tech Stack: Integrated Pillow (LANCZOS) for anti-aliasing during downsampling and pynput for non-blocking event listening.
  • The Benefit: It transforms a manual “3-minute chore” into a 0-second background process, allowing developers to maintain their “Flow State.”

【Action】今すぐ「執筆環境を整えよう」を手に入れよう!

ブロガーなら、画像を使って手順を紹介する機会は多いはずだ。 俺のこのブログでも、これからそういう記事がどんどん増えていく。

だからこそ、まずは執筆に集中できる「環境」を整えよう。 このコードをコピーして、あなたのPCに忍ばせてみてほしい。 明日から、画像編集ソフトを開く時間はゼロになる。

浮いたその30分で、もう一言、読者の心を動かす文章が書けるはずだ。 画像編集なんていう「作業」はプログラムに任せて、俺たちブロガーは「思考」と「創造」に全力を注ごうぜ。

このツールは、単なるプログラミングの練習じゃない。俺のブログ [WordPress・運営] を支える、文字通りの基盤なんだ。

「明日の記事、もっと楽に書けるかもな」 そう思ってくれたなら、ぜひ 叡志技研(Ask-Asuka Tech) をお気に入りに入れて、これからの進化をチェックしてくれ。 技術で日常を変えていく。それが、俺たちのスタイルだ。

💡 さらに便利に使うためのTips:Windows起動時に自動実行させる

毎回手動でスクリプトを実行するのは面倒。

Win + R キーで shell:startup と入力して開くフォルダに、この .pyw ファイルのショートカットを入れておきましょう。これで、PCを立ち上げた瞬間から「PrintScreen即WebP」が常駐。永続化されます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントは日本語で入力してください。(スパム対策)