利用Python PIL 生成图片

柔情只为你懂 2022-03-01 14:16 459阅读 0赞
  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. """
  4. @author: morgan
  5. @time: 3/22/19 2:20 PM
  6. """
  7. import os
  8. from PIL import Image, ImageDraw, ImageFont
  9. import cStringIO
  10. import urllib2
  11. class DrawManage:
  12. def __init__(self, items):
  13. self.team_id = items.get('team_id')
  14. self.user_id = items.get('user_id')
  15. self.back_image = items.get('back_image')
  16. self.height = 421
  17. self.width = 237
  18. self.border = 20
  19. self.header = items.get('header_url')
  20. self.root_dir = os.path.abspath(os.path.join(os.getcwd(), ".."))
  21. self.font_path = '{0}/tmp/huawenxihei.ttf'.format(self.root_dir)
  22. self.qr = items.get('qr')
  23. self.fig = items.get('fig')
  24. def circle_corner(self, img, radii):
  25. """
  26. 圆角处理
  27. :param img: 源图象。
  28. :param radii: 半径,如:30。
  29. :return: 返回一个圆角处理后的图象。
  30. """
  31. # 画圆(用于分离4个角)
  32. circle = Image.new('L', (radii * 2, radii * 2), 0) # 创建一个黑色背景的画布
  33. draw = ImageDraw.Draw(circle)
  34. draw.ellipse((0, 0, radii * 2, radii * 2), fill=255) # 画白色圆形
  35. # 原图
  36. img = img.convert("RGBA")
  37. w, h = img.size
  38. # 画4个角(将整圆分离为4个部分)
  39. alpha = Image.new('L', img.size, 255)
  40. alpha.paste(circle.crop((0, 0, radii, radii)), (0, 0)) # 左上角
  41. alpha.paste(circle.crop((radii, 0, radii * 2, radii)), (w - radii, 0)) # 右上角
  42. alpha.paste(circle.crop((radii, radii, radii * 2, radii * 2)), (w - radii, h - radii)) # 右下角
  43. alpha.paste(circle.crop((0, radii, radii, radii * 2)), (0, h - radii)) # 左下角
  44. # alpha.show()
  45. img.putalpha(alpha) # 白色区域透明可见,黑色区域不可见
  46. return img
  47. def get_base_image(self, url):
  48. '''
  49. 获取图片对象
  50. :param image_url:
  51. :return:
  52. '''
  53. file = urllib2.urlopen(url)
  54. tmpIm = cStringIO.StringIO(file.read())
  55. base_img = Image.open(tmpIm)
  56. re_base_img = base_img.convert('RGBA') # 兼容多种图片
  57. return re_base_img
  58. def get_image_info(self):
  59. base_image = self.get_base_image(self.back_image)
  60. base_image = base_image.resize((self.width, self.height), Image.ANTIALIAS)
  61. width, height = base_image.size
  62. new_base = Image.new('RGBA', (width, height)) # 不知道 color 为透明图片
  63. # 创建白色白色图片
  64. blank = self.get_blank(self.width - self.border, self.height - self.border - 100, (255, 255, 255), 20)
  65. blank_2 = self.get_blank(self.width - self.border, self.height - self.border - 300, (255, 255, 255), 20)
  66. # 合并图片
  67. new_base.paste(blank, (10, 10))
  68. new_base.paste(blank_2, (10, 312))
  69. # 合并图标
  70. r, g, b, alpha = new_base.split()
  71. alpha = alpha.point(lambda i: i > 0 and 300)
  72. base_image = Image.composite(new_base, base_image, alpha)
  73. # 获取头像
  74. header = self.get_image(self.header, 50)
  75. qr = self.get_qr()
  76. fig = self.get_image(self.fig, 60)
  77. base_image.paste(qr, (20, 320))
  78. base_image.paste(fig, (120, 320))
  79. # header.paste(self.get_qr(), (20, 320))
  80. # 合并头像 二维码等信息
  81. base_image.paste(header, (100, 30))
  82. self.draw_text(base_image)
  83. base_image.show()
  84. # base_image.save('test.png')
  85. def draw_text(self, target):
  86. '''
  87. 图上写字
  88. :param target:
  89. :return:
  90. '''
  91. user_name = '呵呵呵56546546546546'[:9]
  92. promotion = '向你推荐一很棒的店铺'
  93. description = '--{0}的小店--'.format(user_name[:9]).center(30, ' ')
  94. user_name = user_name.center(9, ' ')
  95. agent_info = '欢迎成为代理'
  96. qr_description = '长按二维码参加'
  97. draw = ImageDraw.Draw(target)
  98. font = ImageFont.truetype(self.font_path, 18)
  99. font_14 = ImageFont.truetype(self.font_path, 14)
  100. font_12 = ImageFont.truetype(self.font_path, 12)
  101. draw.text((95, self.border + 70), unicode(user_name, 'utf-8'), fill=(0, 0, 0), font=font)
  102. draw.text((50, self.border + 100), unicode(promotion, 'utf-8'), fill=(0, 0, 0), font=font_14)
  103. draw.text((44, self.border + 140),
  104. unicode(description, 'utf-8'),
  105. fill=(0, 0, 0),
  106. font=font_14)
  107. draw.text((60, self.border + 170), unicode(agent_info, 'utf-8'), fill=(0, 0, 0), font=font)
  108. draw.text((120, self.border + 370), unicode(qr_description, 'utf-8'), fill=(0, 0, 0), font=font_12)
  109. ImageDraw.Draw(target)
  110. return target
  111. def get_blank(self, width, height, color, radii):
  112. target = Image.new('RGBA', (width, height), color)
  113. return self.circle_corner(target, radii)
  114. def get_image(self, image, size):
  115. '''
  116. :return:
  117. '''
  118. header_image = self.get_base_image(image)
  119. header_image = header_image.resize((size, size), Image.ANTIALIAS)
  120. x, y = header_image.size
  121. p = Image.new('RGBA', header_image.size, (255, 255, 255))
  122. p.paste(header_image, (0, 0, x, y), header_image)
  123. header_image = p.copy()
  124. return header_image
  125. def get_qr(self):
  126. qr = self.get_base_image(self.qr)
  127. qr = qr.resize((80, 80), Image.ANTIALIAS)
  128. return qr
  129. if __name__ == '__main__':
  130. items = {
  131. 'back_image': '33333.png',
  132. 'header_url': '3333.png?roundPic/radius/10000',
  133. 'qr': '3333.jpg?imageView2/1/w/90/h/90/interlace/1',
  134. 'fig': '333.png?imageView2/2/w/150/h/100/interlace/1'
  135. }
  136. d = DrawManage(items)
  137. d.get_image_info()

在这里插入利用Python PIL  生成图片图片描述

发表评论

表情:
评论列表 (有 0 条评论,459人围观)

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

相关阅读