#!/usr/bin/env python
# encoding: utf-8
"""
@author: morgan
@time: 3/22/19 2:20 PM
"""
import os
from PIL import Image, ImageDraw, ImageFont
import cStringIO
import urllib2
class DrawManage:
def __init__(self, items):
self.team_id = items.get('team_id')
self.user_id = items.get('user_id')
self.back_image = items.get('back_image')
self.height = 421
self.width = 237
self.border = 20
self.header = items.get('header_url')
self.root_dir = os.path.abspath(os.path.join(os.getcwd(), ".."))
self.font_path = '{0}/tmp/huawenxihei.ttf'.format(self.root_dir)
self.qr = items.get('qr')
self.fig = items.get('fig')
def circle_corner(self, img, radii):
"""
圆角处理
:param img: 源图象。
:param radii: 半径,如:30。
:return: 返回一个圆角处理后的图象。
"""
# 画圆(用于分离4个角)
circle = Image.new('L', (radii * 2, radii * 2), 0) # 创建一个黑色背景的画布
draw = ImageDraw.Draw(circle)
draw.ellipse((0, 0, radii * 2, radii * 2), fill=255) # 画白色圆形
# 原图
img = img.convert("RGBA")
w, h = img.size
# 画4个角(将整圆分离为4个部分)
alpha = Image.new('L', img.size, 255)
alpha.paste(circle.crop((0, 0, radii, radii)), (0, 0)) # 左上角
alpha.paste(circle.crop((radii, 0, radii * 2, radii)), (w - radii, 0)) # 右上角
alpha.paste(circle.crop((radii, radii, radii * 2, radii * 2)), (w - radii, h - radii)) # 右下角
alpha.paste(circle.crop((0, radii, radii, radii * 2)), (0, h - radii)) # 左下角
# alpha.show()
img.putalpha(alpha) # 白色区域透明可见,黑色区域不可见
return img
def get_base_image(self, url):
'''
获取图片对象
:param image_url:
:return:
'''
file = urllib2.urlopen(url)
tmpIm = cStringIO.StringIO(file.read())
base_img = Image.open(tmpIm)
re_base_img = base_img.convert('RGBA') # 兼容多种图片
return re_base_img
def get_image_info(self):
base_image = self.get_base_image(self.back_image)
base_image = base_image.resize((self.width, self.height), Image.ANTIALIAS)
width, height = base_image.size
new_base = Image.new('RGBA', (width, height)) # 不知道 color 为透明图片
# 创建白色白色图片
blank = self.get_blank(self.width - self.border, self.height - self.border - 100, (255, 255, 255), 20)
blank_2 = self.get_blank(self.width - self.border, self.height - self.border - 300, (255, 255, 255), 20)
# 合并图片
new_base.paste(blank, (10, 10))
new_base.paste(blank_2, (10, 312))
# 合并图标
r, g, b, alpha = new_base.split()
alpha = alpha.point(lambda i: i > 0 and 300)
base_image = Image.composite(new_base, base_image, alpha)
# 获取头像
header = self.get_image(self.header, 50)
qr = self.get_qr()
fig = self.get_image(self.fig, 60)
base_image.paste(qr, (20, 320))
base_image.paste(fig, (120, 320))
# header.paste(self.get_qr(), (20, 320))
# 合并头像 二维码等信息
base_image.paste(header, (100, 30))
self.draw_text(base_image)
base_image.show()
# base_image.save('test.png')
def draw_text(self, target):
'''
图上写字
:param target:
:return:
'''
user_name = '呵呵呵56546546546546'[:9]
promotion = '向你推荐一很棒的店铺'
description = '--{0}的小店--'.format(user_name[:9]).center(30, ' ')
user_name = user_name.center(9, ' ')
agent_info = '欢迎成为代理'
qr_description = '长按二维码参加'
draw = ImageDraw.Draw(target)
font = ImageFont.truetype(self.font_path, 18)
font_14 = ImageFont.truetype(self.font_path, 14)
font_12 = ImageFont.truetype(self.font_path, 12)
draw.text((95, self.border + 70), unicode(user_name, 'utf-8'), fill=(0, 0, 0), font=font)
draw.text((50, self.border + 100), unicode(promotion, 'utf-8'), fill=(0, 0, 0), font=font_14)
draw.text((44, self.border + 140),
unicode(description, 'utf-8'),
fill=(0, 0, 0),
font=font_14)
draw.text((60, self.border + 170), unicode(agent_info, 'utf-8'), fill=(0, 0, 0), font=font)
draw.text((120, self.border + 370), unicode(qr_description, 'utf-8'), fill=(0, 0, 0), font=font_12)
ImageDraw.Draw(target)
return target
def get_blank(self, width, height, color, radii):
target = Image.new('RGBA', (width, height), color)
return self.circle_corner(target, radii)
def get_image(self, image, size):
'''
:return:
'''
header_image = self.get_base_image(image)
header_image = header_image.resize((size, size), Image.ANTIALIAS)
x, y = header_image.size
p = Image.new('RGBA', header_image.size, (255, 255, 255))
p.paste(header_image, (0, 0, x, y), header_image)
header_image = p.copy()
return header_image
def get_qr(self):
qr = self.get_base_image(self.qr)
qr = qr.resize((80, 80), Image.ANTIALIAS)
return qr
if __name__ == '__main__':
items = {
'back_image': '33333.png',
'header_url': '3333.png?roundPic/radius/10000',
'qr': '3333.jpg?imageView2/1/w/90/h/90/interlace/1',
'fig': '333.png?imageView2/2/w/150/h/100/interlace/1'
}
d = DrawManage(items)
d.get_image_info()

还没有评论,来说两句吧...