生活中肯定会遇到两张图片或多张合并成一张图片的情况,下面使用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