生活中肯定會遇到兩張圖片或多張合併成一張圖片的情況,下面使用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