生成海報(前端 | python)

我最近沒有摸魚,一直都在工做。只不過目前須要爬一點數據 python 作的,以後看機會分享一下。html

忙着忙着老大說要生成海報,有個活動要給每一個用戶來個分享圖。前端

想法

  1. PS 批處理?腳本? 能甩出去的活都甩出去,機智如我啊
  2. python 處理圖像(PIL)。這麼坑的想法,固然不是我想的了。雖然我實現了
  3. 寫個頁面調用以前生成長截圖的服務。以前有個爲了方便分享微信,作了生成長截圖的服務。寫個新的頁面用一下便可。
  4. 我堂堂前端er,怎麼能一直用別的工具呢?個人錘子呢?

ps處理

這個方案,通過我調研行不通。(也有多是我菜)
對於批量打碼,統一操做這類的還能夠。
對於須要對應名字之類的比較無力python

python

老大說 pythonpy 使用 PIL 庫 寫起來還蠻簡單的。
py 使用這段時間以來就是感受這個編碼格式極其難受。有沒有大佬解救我一下。canvas

根據不一樣的類型輸出數據

  1. txt 使用字體,輸出到對應位置
  2. image 圖片,覆蓋輸出到對應位置。mask=img要注意針對 png 來使用
  3. qrcode 生成對應二維碼

經過上面的類型,來增長咱們代碼的擴展性。segmentfault

代碼

# -*- coding: utf-8 -*-
from PIL import Image, ImageDraw, ImageFont
import qrcode
import time;
import re
def AddMoney(data):
  bg = Image.new('RGBA', (data['width'], data['height']))
  for item in data['list']:
    print(item)
    if item['type'] == 'qrcode':
      qr_pil_obj = qrcode.make(item['url'], border=0).resize((item['width'], item['height']), Image.ANTIALIAS)
      bg.paste(qr_pil_obj,(item['x'],item['y']))
    elif item['type'] == 'image':
      extname = re.search( r'(jpg|png|jpeg)$', item['url']).group()
      # 加載圖片
      img = Image.open(item['url'])
      # 縮放
      if (item['width']!= '' and item['height'] != ''):
        img.resize((item['width'], item['height']), Image.ANTIALIAS)

      if extname == 'png':
        bg.paste(img,(item['x'],item['y']), mask=img)
      else:
        bg.paste(img,(item['x'],item['y']))
    elif item['type'] == 'text':
      draw = ImageDraw.Draw(bg)
      ttfront = ImageFont.truetype(item['ttfrontUrl'],item['ttfrontSize'])
      draw.text((item['x'],item['y']),unicode(item['txt'],"UTF-8"), fill=(0,0,0), font=ttfront)
    else:
      print('------------------------------')
  bg.save(data['outputName'])

data = {
  'width': 750,
  'height': 1334,
  'outputName': './out-%s.png' % (str(time.time())),
  'list':[{"type":"image","url":"./avatar.jpg","x":10,"y":360,"width":750,"height":1334},{"type":"image","url":"./bg.png","x":0,"y":0,"width":750,"height":750},{"type":"qrcode","url":"https://www.lilnong.top","x":0,"y":0,"width":120,"height":120},{"type":"text","txt":"你這個死宅說話","x":140,"y":560,"ttfrontUrl":"./abc.ttf","ttfrontSize":55},{"type":"text","txt":"還挺搞笑的","x":160,"y":630,"ttfrontUrl":"./abc.ttf","ttfrontSize":55}]
}
AddMoney(data)

長截圖

這個也是極好,是以前一個 Node 的服務。省時省力。網上查也很多跨域

前端技術處理

我堂堂前端,怎麼也得露一手吧。
基於上面的頁面已經成功。咱們想一下咱們須要幹什麼?把 html 轉成 canvas,而後 canvas.toBlob,而後 download 美滋滋。微信

  1. html2canvas 這是一個,既然已經有寫好的了,咱們就不費神了。(最難的一步。。。)
  2. 拿到 cavnas 調用 APIcanvas.toBlob
  3. 下載。這個就比較簡單了,以前我寫過 前端培訓-初級階段-場景實戰(2019-06-06)-下載文件&下載進度

微信公衆號

各類忘記發。補上補上
clipboard.png工具

結語

py 寫代碼是真的短。
前端處理須要注意跨域URL空格等問題。字體

相關文章
相關標籤/搜索