4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pythonで画像を実寸大印刷してみる

Last updated at Posted at 2022-04-29

はじめに

皆さん、「この画像を8cm × 4cmで印刷したい!」という時にどうすればいいかご存知でしょうか?
ちなみに私はわかりませんでした。

調べてみるとExcelでああしてWordではこうして・・と説明されるのですが面倒になって諦めました。
という訳で、pythonで実寸大印刷するコードを書いてみます。

※Windowsのみで動作します

コード

import win32print
import win32ui
from PIL import Image, ImageWin

class Printer:
    # 下記はプリンタの固有情報を取得するためのキー
    # http://chokuto.ifdef.jp/urawaza/api/GetDeviceCaps.html
    WIDTH_IN_PIXEL = 8
    HEIGHT_IN_PIXEL = 10
    WIDTH_IN_MM = 4
    HEIGHT_IN_MM = 6
    LOGPIXELSX = 88
    LOGPIXELSY = 90
    PHYSICALWIDTH = 110
    PHYSICALHEIGHT = 111
    PHYSICALOFFSETX = 112
    PHYSICALOFFSETY = 113
    
    # 印刷したいサイズ(mm)から画像サイズ(px)を導き出す
    def trans_mm_to_pixel(self, hDC, x_mm, y_mm):
        printable_area_px = hDC.GetDeviceCaps (self.WIDTH_IN_PIXEL), hDC.GetDeviceCaps (self.HEIGHT_IN_PIXEL)
        printable_area_mm = hDC.GetDeviceCaps (self.WIDTH_IN_MM), hDC.GetDeviceCaps (self.HEIGHT_IN_MM)

        px_px, py_px = printable_area_px
        px_mm, py_mm = printable_area_mm
        
        result = (x_mm * px_px / px_mm, y_mm * py_px / py_mm)
        
        return result
        
    # パスで指定した画像を指定した大きさで印刷する
    def print_image(self, image_path, x_mm, y_mm):
        printer_name = win32print.GetDefaultPrinter()
        
        hDC = win32ui.CreateDC ()
        hDC.CreatePrinterDC (printer_name)
        printable_area = hDC.GetDeviceCaps (self.WIDTH_IN_PIXEL), hDC.GetDeviceCaps (self.HEIGHT_IN_PIXEL)
        printer_size = hDC.GetDeviceCaps (self.PHYSICALWIDTH), hDC.GetDeviceCaps (self.PHYSICALHEIGHT)
        printer_margins = hDC.GetDeviceCaps (self.PHYSICALOFFSETX), hDC.GetDeviceCaps (self.PHYSICALOFFSETY)
        
        hDC.StartDoc(image_path)
        hDC.StartPage()
        
        bmp = Image.open (image_path)
        dib = ImageWin.Dib(bmp)
        scaled_width, scaled_height = self.trans_mm_to_pixel(hDC, x_mm, y_mm)

        # 中央に画像を印刷するように
        x1 = int ((printer_size[0] - scaled_width) / 2)
        y1 = int ((printer_size[1] - scaled_height) / 2)
        x2 = int (x1 + scaled_width)
        y2 = int (y1 + scaled_height)
        dib.draw (hDC.GetHandleOutput(), (x1, y1, x2, y2))

        hDC.EndPage ()
        hDC.EndDoc ()
        hDC.DeleteDC ()

画像印刷するコードは下記サイトを大いに参考にさせていただきました。
http://timgolden.me.uk/python/win32_how_do_i/print.html

実寸大で印刷するために、プリンタの印刷可能領域のmm値とpixel値から画像サイズを導出しています。

印刷してみる

正しい大きさで印刷できるか検証するために、ものさしの画像を印刷してみます。
4cm.jpg
次のコードを実行すると自動的に印刷を開始します(OSでデフォルト指定されたプリンターが動作します)

printer = Printer()
printer.print_image("4cm.jpg", 40, 40)

印刷結果
print_result.jpg

おわりに

pythonで簡単に?実寸大印刷することができました。
私の家のプリンターでしか試していないためすべての環境で動作することは保証できませんが、是非お試しあれ。

4
2
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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?