国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

利用Python如何生成便簽圖片詳解

2020-02-15 22:15:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

最近有文字轉(zhuǎn)圖片的需求,但是不太想下載 APP,就使用 Python Pillow 實(shí)現(xiàn)了一個(gè),效果如下:


PIL 提供了 PIL.ImageDraw.ImageDraw.text 方法,可以方便的把文字寫到圖片上,簡(jiǎn)單示例如下:

from PIL import Image, ImageDraw, ImageFont# get an imagebase = Image.open('Pillow/Tests/images/hopper.png').convert('RGBA')# make a blank image for the text, initialized to transparent text colortxt = Image.new('RGBA', base.size, (255,255,255,0))# get a fontfnt = ImageFont.truetype('Pillow/Tests/fonts/FreeMono.ttf', 40)# get a drawing contextd = ImageDraw.Draw(txt)# draw text, half opacityd.text((10,10), "Hello", font=fnt, fill=(255,255,255,128))# draw text, full opacityd.text((10,60), "World", font=fnt, fill=(255,255,255,255))out = Image.alpha_composite(base, txt)out.show()

為什么要計(jì)算文字的寬高呢?把文字直接寫到背景圖不可以么?

Pillow PIL.ImageDraw.ImageDraw.text 寫文字是按換行符 /n 換行的,如果個(gè)字符串特別長(zhǎng),文字部分就會(huì)超出背景圖的寬度,所以第一步我們需要先把文本按固定的寬度計(jì)算出高度。

像圖上寫的這樣,文字轉(zhuǎn)圖片分三步:

計(jì)算文字寬高 生成響應(yīng)尺寸背景圖 把文字寫到圖片上

計(jì)算文字寬高

這里背景圖寬度是固定的,所以文字的寬可以不用計(jì)算。 PIL.ImageDraw.ImageDraw.text 是通過(guò) /n 來(lái)?yè)Q行的,那我們只需要在文字合適的位置加上 /n 就可以了。

第一個(gè)想到的是 textwrap 方法,textwrap 可以實(shí)現(xiàn)通過(guò)調(diào)整換行符的位置來(lái)格式化文本。但 textwrap 還有一個(gè)問(wèn)題就是它是根據(jù)字符長(zhǎng)度來(lái)分隔的,但文本中的字符并不是等寬的,通過(guò) textwrap 格式化后的文字寫到圖片上效果可能是這樣的:


使用這種方式,如果我們要調(diào)整字體大小,每一行的長(zhǎng)度都還需要再重新調(diào)整。

為了保證每一行寬度盡可能的一致,這里使用 PIL.ImageDraw.ImageDraw.textsize 獲取字符寬高,然后按約定寬度把長(zhǎng)文本分隔成文本列表,然后把列表每行文字寫到圖片上。

def get_paragraph(text, note_width): # 把每段文字按約定寬度分隔成幾行 txt = Image.new('RGBA', (100, 100), (255, 255, 255, 0)) # get a drawing context draw = ImageDraw.Draw(txt) paragraph, sum_width = '', 0 line_numbers, line_height = 1, 0 for char in text: w, h = draw.textsize(char, font) sum_width += w if sum_width > note_width:  line_numbers += 1  sum_width = 0  paragraph += '/n' paragraph += char line_height = max(h, line_height) if not paragraph.endswith('/n'): paragraph += '/n' return paragraph, line_height, line_numbersdef split_text(text): # 將文本按規(guī)定寬度分組 max_line_height, total_lines = 0, 0 paragraphs = [] for t in text.split('/n'): # 先按 /n 把文本分段 paragraph, line_height, line_numbers = get_paragraph(t) max_line_height = max(line_height, max_line_height) total_lines += line_numbers paragraphs.append((paragraph, line_numbers)) line_height = max_line_height total_height = total_lines * line_height # 這里返回分好的段,文本總高度以及行高 return paragraphs, total_height, line_height            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长海县| 铁力市| 尼木县| 东辽县| 东安县| 平顺县| 山西省| 克山县| 平谷区| 青田县| 望奎县| 彝良县| 淮滨县| 新乡县| 福建省| 南溪县| 南和县| 葵青区| 长沙市| 永顺县| 岢岚县| 白城市| 武穴市| 靖边县| 清丰县| 高平市| 万全县| 台州市| 梨树县| 山阴县| 石泉县| 汤阴县| 武隆县| 宁阳县| 星子县| 囊谦县| 大名县| 南丰县| 龙川县| 海口市| 大理市|