1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】tkinterで画面サイズを取得し、画像をWindowsクリップボードへコピーする

1
Last updated at Posted at 2026-09-21

はじめに

今回は、tkinterを使って画面サイズを取得する方法と、Windowsのクリップボードに画像をコピーする方法についてまとめます。

QRコードリーダー・デコーダーのプロジェクトを作成する過程で必要になった内容です。Githubにて公開いたしました。

① 画面サイズを取得する

tkinterには、画面サイズを取得するためのメソッドが用意されています。

  • winfo_screenheight() — 画面の高さ(ピクセル単位)
  • winfo_screenwidth() — 画面の幅(ピクセル単位)
  • winfo_screenmmheight() — 画面の高さ(mm単位)
  • winfo_screenmmwidth() — 画面の幅(mm単位)

ピクセル単位で取得する

例えば、画面の幅と高さをピクセル単位で取得する場合は以下のようにします。

import tkinter as tk

root = tk.Tk()

height = root.winfo_screenheight()
width = root.winfo_screenwidth()

print(f"\nwidth x height = {width} x {height} (in pixels)\n")

root.destroy()

実行結果の例:

width x height = 1600 x 1200 (in pixels)

mm単位で取得する

mm単位で取得する場合は、以下のように使用します。

import tkinter as tk

root = tk.Tk()

height = root.winfo_screenmmheight()
width = root.winfo_screenmmwidth()

print(f"\nwidth x height = {width} x {height} (in mm)\n")

root.destroy()

実行結果の例:

width x height = 423 x 318 (in mm)

② クリップボードに画像をコピーする

テキストをクリップボードにコピーするだけなら、tkinterのclipboard_append()を使って簡単に実現できます。

一方、画像をクリップボードにコピーする場合は少し異なります。

Windowsのクリップボードでは、PILのImageオブジェクトやPNGファイルのバイト列を、そのまま画像として登録することはできません。Windowsが扱うクリップボード形式に変換する必要があります。

そこで、Windowsのクリップボードを操作できるpywin32のwin32clipboardを使用します。

import io
import win32clipboard
from PIL import Image


def copy_image_to_clipboard(img: Image.Image):
    output = io.BytesIO()

    # PIL ImageをBMP形式としてメモリ上に保存
    img.convert("RGB").save(output, "BMP")

    # BMPファイルの先頭14バイト(BITMAPFILEHEADER)を取り除く
    data = output.getvalue()[14:]

    output.close()

    try:
        win32clipboard.OpenClipboard()
        win32clipboard.EmptyClipboard()
        win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
    finally:
        win32clipboard.CloseClipboard()

ポイント

この処理では、主に以下の3つのことを行っています。

1. PIL Imageをメモリ上でBMPに変換する

output = io.BytesIO()
img.convert("RGB").save(output, "BMP")

BytesIOを使うことで、画像を一度ファイルとしてディスクに保存する必要がありません。

2. BMPのファイルヘッダーを取り除く

data = output.getvalue()[14:]

BMPファイルには、先頭にBITMAPFILEHEADERという14バイトのファイルヘッダーがあります。

一方、CF_DIBとしてクリップボードに登録する場合、このBMPファイルヘッダーは必要ありません。そのため、先頭14バイトを取り除きます。

3. CF_DIBとしてクリップボードに登録する

win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)

これで、BMPのDIB部分をWindowsのクリップボードに登録できます。

この方法を使うことで、PILで生成したQRコードなどの画像を、Windowsのクリップボードへコピーし、ペイントや画像編集ソフトなどの対応アプリケーションへ直接貼り付けられるようになります。

おわりに

自分のプロジェクトを作成している際に、このあたりの処理について日本語でまとまった参考記事があまり見つからなかったのでまとめました。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?