接上篇使用Puppeteer輕鬆爬取網易雲音樂、QQ音樂的精品歌單,沒有看的能夠看看,順便給個當心心啊!html
上一篇咱們經過Puppeteer爬取了,網易雲音樂和QQ音樂播放量超過1000W的歌單,爲了更好的獲取和分享歌單,此次咱們經過代碼合成可以分享的圖片。python
本次採用語言爲:Python,NodeJS版本正在開發中,後續會分享出來。git
項目完整代碼地址:圖片合成github
先上兩張效果圖,來看一下。bash
先分析一下圖片的主要點:網絡
python環境python2.7
安裝 python 運行環境,能夠是 2.7 或者 3.* 版本,根據本身須要安裝。工具
具體安裝方法參考官網。post
具體的每一個系統相關的安裝教程,請自行百度,這裏再也不贅述。學習
安裝PIL庫
安裝用來處理圖片的庫 PIL。
具體安裝方法和不一樣系統以及 python 版本的相應安裝命令,參閱官網
安裝pathlib
安裝路徑相關的依賴庫。
pip install pathlib
複製代碼
安裝requests
pip install requests
複製代碼
安裝qrcode
pip install qrcode
複製代碼
下載依賴字體文件
字體文件爲可選項,能夠下載本身喜好的字體,實現自定義字體,也能夠使用默認字體。
首先分析一下咱們要幹些什麼。
找一張合適的背景圖
在 Unsplash 上找一張適合作背景的圖片。
調整到合適的尺寸。
添加文字
經過 PIL 的方法,想圖片上繪製文字。
def add_text(img, text, size, position, color="#9400D3"):
draw = ImageDraw.Draw(img)
# 設置字體爲自定義字體
font = ImageFont.truetype('MFJingYue.ttf', size)
draw.text(position, text, fill=color, font=font, align="center")
複製代碼
添加文字須要給定添加的位置,因此咱們還須要一個方法來肯定文字的位置。
# 獲取文字的x座標,主要用來設置歌單名稱的位置,保證每行居中並不會太長
def get_x_position(len):
max = 14
x = 50 + (max - len) * 25 / 2
return x
複製代碼
番外話:爲了簡單,我直接在這裏設置的字號爲50,寫死了,若是想要自定義的換能夠多加一個參數,而後根據需求設置具體的位置
添加圖片
經過 PIL 的方法能夠直接把一張圖片粘貼到另外一張圖片上。
# 下邊爲例子
img_one = Image.open(pathlib.Path('one.jpg'));
img_two = Image.open(pathlib.Path('two.jpg'));
# 設置圖片替換位置
box = (100, 50, 350, 300)
# 選取圖片,並設置大小
region = img_one
region = region.resize((box[2] - box[0], box[3] - box[1]))
# 粘貼圖片到相應位置
img_two.paste(region, box)
複製代碼
生成二維碼
經過 qrcode 庫,咱們可以很容易的生成二維碼,而後根據咱們數據的來源打上相應的 logo。
# 生成二維碼
def make_qrcode(url, type):
qr = qrcode.QRCode(
version=5,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=8,
border=3
)
qr.add_data(url)
# qr.make(fit = True)
img = qr.make_image()
img = img.convert("RGBA")
icon = None
if type == 'netease':
icon = Image.open(pathlib.Path('netease.png'))
elif type == 'qq':
icon = Image.open(pathlib.Path('qq.png'))
img_w, img_h = img.size
factor = 4
size_w = int(img_w/factor)
size_h = int(img_h/factor)
icon_w, icon_h = icon.size
if icon_w > size_w:
icon_w = size_w
if icon_h > size_h:
icon_h = size_h
icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
w = int((img_w-icon_w)/2)
h = int((img_h-icon_h)/2)
img.paste(icon, (w,h), icon)
# 最後返回圖片對象
return img
複製代碼
粘貼二維碼
生成的二維碼爲一個圖片對象,咱們能夠直接經過圖片的粘貼方法,直接粘貼到相應的位置。
# 生成二維碼地址
qrcode_img = make_qrcode(address, type)
# 粘貼到背景圖上
box_qrcode = (300, 527, 425, 652)
print qrcode_img.size, qrcode_img.mode
# qrcode_img.save('./qrcode.png')
region_qrcode = qrcode_img
region_qrcode = region_qrcode.resize((box_qrcode[2] - box_qrcode[0], box_qrcode[3] - box_qrcode[1]))
background_img.paste(region_qrcode, box_qrcode)
複製代碼
最後把全部的功能整合成一個方法,而後經過參數,傳入相對應的參數,就能生成一張可以用於分享的圖片了。
# 合成分享圖
def merge_img(img_src, name, count, address, author, type):
save_name = './' + name + '.jpg'
name = unicode(name, 'UTF-8')
count = unicode("播放量:" + count, 'UTF-8')
author = unicode("建立人:" + author, 'UTF-8')
background_img = Image.open(pathlib.Path('background.jpg'))
# 獲取遠程圖片
response = requests.get(img_src)
img = Image.open(BytesIO(response.content))
# 設置圖片替換位置
box = (100, 50, 350, 300)
# 選取圖片
region = img
region = region.resize((box[2] - box[0], box[3] - box[1]))
# 粘貼到背景圖上
background_img.paste(region, box)
# 添加名字
name_len = len(name)
if name_len <= 14:
x = get_x_position(name_len)
add_text(background_img, name, 25, (x, 330))
else:
name_one = name[0:14]
print name_one
add_text(background_img, name_one, 25, (50, 330))
name_two = name[14:name_len]
print name_two
x = get_x_position(len(name_two))
add_text(background_img, name_two, 25, (x, 370))
# 添加建立者
add_text(background_img, author, 20, (50, 560), color='white')
# 添加播放數
add_text(background_img, count, 20, (50, 600), color='white')
# 生成二維碼地址
qrcode_img = make_qrcode(address, type)
# 粘貼到背景圖上
box_qrcode = (300, 527, 425, 652)
print qrcode_img.size, qrcode_img.mode
# qrcode_img.save('./qrcode.png')
region_qrcode = qrcode_img
region_qrcode = region_qrcode.resize((box_qrcode[2] - box_qrcode[0], box_qrcode[3] - box_qrcode[1]))
background_img.paste(region_qrcode, box_qrcode)
# 保存圖片
background_img.save(save_name)
複製代碼
測試
img_one = 'https://p.qpic.cn/music_cover/1Fr9IFMhWDPeUzWKVEjn3VLzce1PenAOaaImqzoibx2iaE5rhV0RwMYA/300?n=1'
img_two = 'http://p1.music.126.net/wpahk9cQCDtdzJPE52EzJQ==/109951163271025942.jpg?param=140y140'
address_one = 'https://y.qq.com/n/yqq/playsquare/2643652402.html#stat=y_new.playlist.pic_click'
address_two = 'https://music.163.com/#/playlist?id=2201879658'
name_one = '回頭率最高的50首手機鈴聲'
name_two = '你的青春裏有沒有屬於你的一首歌?'
merge_img(img_one, name_one, '4622.8萬', address_one, author="Harry", type="qq")
merge_img(img_two, name_two, '2428萬', address_two, author="mayuko然", type="netease")
複製代碼
而後就生成了,開始咱們看到的兩張圖片了。
對於圖片的處理 PIL 十分強大,擁有不少方法可供使用,是一個不錯的庫。
經過簡單的學習,可以根據思路生成不一樣的分享圖片,對於有強烈分享需求的接口來講是個不錯的嘗試。