四、python圖像合併,打印圖片

生活中肯定會遇到兩張圖片或多張合併成一張圖片的情況,下面使用python+Pillow 實現這個目的。
代碼:

import win32print
import win32ui
import win32con
from barcode.writer import ImageWriter
from barcode.codex import Code39
from PIL import Image, ImageDraw, ImageFont, ImageWin, ImageColor
from StringIO import StringIO
import os
def merge(self, image1, image2):
        '''
        實現垂直合併兩張圖片
        @param image1: 需要合併的第一張圖片
        @param image2: 需要合併的第二張圖片
        '''

        w1, h1 = image1.size
        w2, h2 = image2.size
        target = Image.new('RGB', (w1 if w1 > w2 else w2 , h1 + h2), (255, 255, 255, 0))
        temp = image1.resize((w1, h1), Image.ANTIALIAS)
        target.paste(temp, (0, 0, w1, h1))
        temp1 = image2.resize((w2, h2), Image.ANTIALIAS)
        target.paste(temp1, (0, h1, w2, h1 + h2))
        target.save('merge.png')

        target.show()
if __name__ == '__main__':
    printer_name = win32print.GetDefaultPrinter()
    print printer_name

    t = Test()

    t.merge(Image.open('t.png'), Image.open('image2.png'))

效果如下:
輸入圖片說明

打印圖片,pywin32上的例子,爲了方便,在這裏在粘貼一遍

def imagePirnter(self):
        #
        # Constants for GetDeviceCaps
        #
        #
        # HORZRES / VERTRES = printable area
        #
        HORZRES = 8
        VERTRES = 10
        #
        # LOGPIXELS = dots per inch
        #
        LOGPIXELSX = 88
        LOGPIXELSY = 90
        #
        # PHYSICALWIDTH/HEIGHT = total area
        #
        PHYSICALWIDTH = 110
        PHYSICALHEIGHT = 111
        #
        # PHYSICALOFFSETX/Y = left / top margin
        #
        PHYSICALOFFSETX = 112
        PHYSICALOFFSETY = 113

        printer_name = win32print.GetDefaultPrinter ()
        file_name = "merge.png"

        #
        # You can only write a Device-independent bitmap
        #  directly to a Windows device context; therefore
        #  we need (for ease) to use the Python Imaging
        #  Library to manipulate the image.
        #
        # Create a device context from a named printer
        #  and assess the printable size of the paper.
        #
        hDC = win32ui.CreateDC ()
        hDC.CreatePrinterDC (printer_name)
        printable_area = hDC.GetDeviceCaps (HORZRES), hDC.GetDeviceCaps (VERTRES)
        printer_size = hDC.GetDeviceCaps (PHYSICALWIDTH), hDC.GetDeviceCaps (PHYSICALHEIGHT)
        printer_margins = hDC.GetDeviceCaps (PHYSICALOFFSETX), hDC.GetDeviceCaps (PHYSICALOFFSETY)

        #
        # Open the image, rotate it if it's wider than
        #  it is high, and work out how much to multiply
        #  each pixel by to get it as big as possible on
        #  the page without distorting.
        #
        bmp = Image.open (file_name)
#         if bmp.size[0] > bmp.size[1]:
#             bmp = bmp.rotate (90)

        ratios = [1.0 * printable_area[0] / bmp.size[0], 1.0 * printable_area[1] / bmp.size[1]]
        scale = min (ratios)

        #
        # Start the print job, and draw the bitmap to
        #  the printer device at the scaled size.
        #
        hDC.StartDoc (file_name)
        hDC.StartPage ()

        dib = ImageWin.Dib (bmp)
        scaled_width, scaled_height = [int (scale * i) for i in bmp.size]
        x1 = int ((printer_size[0] - scaled_width) / 2)
        y1 = int ((printer_size[1] - scaled_height) / 2)
        x2 = x1 + scaled_width
        y2 = y1 + scaled_height
        dib.draw (hDC.GetHandleOutput (), (x1, y1, x2, y2))

        hDC.EndPage ()
        hDC.EndDoc ()
        hDC.DeleteDC ()
if __name__ == '__main__':
    t = Test()
    t.imagePirnter()

效果如下:
輸入圖片說明

參考文章:
pywin32 win32print http://timgolden.me.uk/python/win32_how_do_i/print.html

發佈了50 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章