はじめに
今回は、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のクリップボードへコピーし、ペイントや画像編集ソフトなどの対応アプリケーションへ直接貼り付けられるようになります。
おわりに
自分のプロジェクトを作成している際に、このあたりの処理について日本語でまとまった参考記事があまり見つからなかったのでまとめました。