クリップボード内の画像サイズを調整する

クリップボード内の画像サイズを調整する

クリップボード内にある画像をファイル保存せず、大きさ調整するプログラムを書いた。ブログやSNS投稿用に作ったんだが、我ながら便利だ。

Windows専用で人によっては残念。

使い方

下記のソース2つを手元に用意して、画像をコピーしたら、バッチファイルを実行。これで横幅が640に変更され、その結果がクリップボードに入る。640以外のサイズにしたい人は、バッチファイルソース内の値を編集する。自分も何サイズか用意している。
python3のインストールと、Pillow および pywin32 モジュールのインストールが必要。pythonのパスはいい感じに通しておく。

ソースコード

ここにもソースを張るが、最新は githubで。(ただしgithub側のバッチファイルはpythonの場所が自分の環境用にvenvを有効にする感じになってる。)

https://github.com/logicalmodelin/LGMLtools/tree/main/blog20221215_resize_clipboard_image

import sys
from PIL import ImageGrab
import io

if __name__ == '__main__':
    try:
        import win32clipboard
    except ImportError:
        print('win32clipboard モジュールが必要です。'
              ' >pip install pywin32 | python -m pip install pywin32', file=sys.stderr)
        sys.exit(1)
    if len(sys.argv) < 2:
        print('画像の横幅を第一引数に指定してください。', file=sys.stderr)
        sys.exit(1)
    img = ImageGrab.grabclipboard()
    if not img:
        print('クリップボードに画面がありません。', file=sys.stderr)
        sys.exit(1)

    width = int(sys.argv[1])

    # if img.size[0] < width:
    #     print('画像の横幅が指定より小さいです。', file=sys.stderr)
    #     sys.exit(1)

    ratio = float(img.size[0] / img.size[1])
    size = (width, int(width / ratio))
    img = img.resize(size)
    # img.show()

    output = io.BytesIO()
    img = img.convert('RGB')
    img.save(output, 'BMP')
    data = output.getvalue()[14:]
    output.close()

    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
    win32clipboard.CloseClipboard()

    print(f'クリップボードに画面({size[0]}x{size[1]})を保存しました。')
python resize_clipboard_image.py 640

技術メモ

クリップボードの画像取得は ImageGrab で可能だが、ペーストはごねごねしないとだめで、Windowsでは、BMPフォーマットのヘッダなしみたいなのを入力しないといけないみたいだ。以下2サイトを参考とした。

https://jangle.tokyo/2020/07/07/post-2241/

https://code.tiblab.net/python/pil/clipboard_send_image

Macはどうやんの?

Previous post Houdini:バックアップフォルダの一覧を作るpython script
Next post SubstanceDesigner:お手軽パース変形