なぜ作ろうと思ったか
とあるサイトで、画面にマウスや指、アップルペンシルなどを使って描画したものをサーバーに送信できる機能がありました。自分はwindowsを使っているのでマウスでしか描画できません。そうした際に文字をきれいに描画することができないという問題が発生します。そういった問題を解決するため、このツールを作成することとしました。
制作過程とコード配布
pythonにあるpyautoguiとpillowというライブラリを組み合わせて作ることとしました。
pypiを使ったライブラリのインストールコマンド
pip install pyautogui pillow
ChatGPTが作ったコードを改良しただけではありますが、完成形を配布します!
*テキストとttfフォントへのパスは自分で指定してください。
(動作確認済みの環境:python 3.10)
import pyautogui
import time
from PIL import Image, ImageDraw, ImageFont
# 手書き風に描くテキスト
text = "描画するテキスト"
font_size = 48
# 手書き風に描くために使うフォントの設定
# 適当な手書き風フォントファイル(.ttf)を指定してください
font_path = "ttfフォントファイルへのパス"
font = ImageFont.truetype(font_path, font_size)
# テキストのサイズを取得
bbox = font.getbbox(text)
text_width, text_height = bbox[2] - bbox[0], bbox[3] + bbox[3]
# キャンバスの作成
image = Image.new("L", (text_width, text_height), 255)
draw = ImageDraw.Draw(image)
draw.text((0, 0), text, font=font)
# テキスト画像のピクセル情報を取得
pixels = image.load()
# 手書きするペイントアプリのキャンバスの左上位置を指定
start_x = 1000 # 開始位置のx座標
start_y = 300 # 開始位置のy座標
# 白以外の(手書きの軌跡が見える)ピクセルのリストを取得
positions = []
for y in range(text_height):
for x in range(text_width):
if pixels[x, y] < 200: # 黒色または灰色のピクセルを取得
positions.append((start_x + x, start_y + y))
# 描画位置の確認のために最後の位置を表示(デバッグ用)
print("Last position:", positions[-1])
# 取得したピクセル位置を手書きで描画する
pyautogui.PAUSE = 0.005 # 軌跡をゆっくりにするためのポーズ
pyautogui.click(start_x, start_y) # ペイントキャンバス上をクリックしてアクティブ化
for position in positions:
pyautogui.moveTo(position[0], position[1]) # マウスを移動
pyautogui.click() # クリックして描画
# 描画の終了
pyautogui.mouseUp()
動作例
動画で見たほうが早いと思うので、動画を張っておきます。
(描画を滑らかにするためにゆっくり少しずつ描画しており、GIFが長すぎるため8倍速です)
問題点
- 異なるテキストを描画する際に毎回コードを編集する必要がある
- 異なるフォントで描画する際に毎回コードを編集する必要がある
- 描画中に描画を停止できない (コードの改良で簡単に実現できそう...?)
- 描画が非常に遅い
まとめ
あまり実用性はなさそうですが、自分は冒頭で述べたサイトをよく使うため、時々使っています。
問題点で述べた点については簡単に改善できそうですが、自分はあまり気にならないのでまだ改良していませんが、また改良したらコードを共有しようと思っています。