Python利用Flask動(dòng)態(tài)生成漢字頭像
基礎(chǔ)環(huán)境配置
再 Python 的 Flask 框架中,我們使用 Python 的圖片處理庫(kù)(例如 Pillow)來(lái)生成一個(gè)漢字圖片。
首先看一個(gè)簡(jiǎn)單的示例,然后再此基礎(chǔ)上,進(jìn)行細(xì)節(jié)優(yōu)化。
提前安裝 PIL 模塊
pip install pillow
接下來(lái)的視圖函數(shù)和代碼框架,可參考爬蟲(chóng)訓(xùn)練場(chǎng)系列博客中的任意一篇,這里橡皮擦在 app/apis 目錄的 index.py 文件中進(jìn)行操作。
建立基礎(chǔ)代碼結(jié)構(gòu),如下所示:
@api.route('/avatars') def index(): # 生成隨機(jī)漢字 def get_random_common_char(): # 讀取文件中的常用漢字 with open('demo.txt', 'r', encoding='utf-8') as f: common_chars = f.read() # 去除空格 common_chars = common_chars.replace(' ', '') common_chars = common_chars.strip() # 創(chuàng)建字符映射表 translator = {ord(c): None for c in common_chars if unicodedata.category(c).startswith('P')} # 使用字符映射表去除標(biāo)點(diǎn)符號(hào) s = common_chars.translate(translator) return random.choice(s) hanchar = get_random_char() # 生成圖片 image = Image.new('RGB', (200, 200), (255, 255, 255)) draw = ImageDraw.Draw(image) font = ImageFont.truetype('arial.ttf', 36) draw.text((50, 50), char, font=font, fill=(0, 0, 0)) # 將圖片轉(zhuǎn)換為二進(jìn)制數(shù)據(jù) image_binary = image.tobytes() # 設(shè)置響應(yīng)頭,返回圖片 response = make_response(image_binary) response.headers['Content-Type'] = 'image/jpeg' return response
此時(shí)的代碼是不能正確返回圖片的,里面存在很多問(wèn)題,需要一一進(jìn)行修改。
加載本地 txt 文件,用于隨機(jī)生成漢字
第一個(gè)問(wèn)題 demo.txt 被我放置在 static 文件夾中,直接讀取肯定是無(wú)法讀取到的,需要用到 os 庫(kù)。
# 獲取根目錄 app_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 拼接 static 文件夾路徑 static_path = os.path.join(app_root, 'static')
此時(shí)可以讀取本地字體文件,代碼如下所示:
os.path.join(static_path, 'demo.txt')
讀取完畢,根目錄變量 app_root 要放到內(nèi)部函數(shù)外,后續(xù)還要使用。
由于我們需要兩個(gè)漢字,所以使用最簡(jiǎn)單的字符串拼接,準(zhǔn)備好 2 個(gè)漢字。
# 可以生成任意內(nèi)容 han_char1 = get_random_common_char() han_char2 = get_random_common_char() han_char = han_char1 + han_char2
Pillow 生成圖片
在 Flask 中生成圖片非常簡(jiǎn)單,稍微麻煩的是直接將圖片以二進(jìn)制流格式返回到前端。
圖片生成的代碼如下所示。
# 生成圖片 image = Image.new('RGB', (64, 64), (255, 255, 255)) draw = ImageDraw.Draw(image) font = ImageFont.truetype(os.path.join(static_path, 'font/msyh.ttf'), 28)
上述代碼使用了 Image.new() 方法,其語(yǔ)法結(jié)構(gòu)如下所示。
Image.new(mode, size, color=0)
其各參數(shù)含義如下:
- mode:圖像模式。例如:‘RGB’、‘RGBA’、‘L’ 等。
- size:圖像大小,以像素為單位。例如:(800, 600)。
- color:圖像背景色。例如:(255, 255, 255)。
這里加載了本地字體文件 msyh.ttf,后續(xù)大家可以去 GitCode 進(jìn)行下載。
除此之外,為了達(dá)到最終效果,還需要繪制一個(gè)同心圓。
# 繪制一個(gè)圓形 # 正方形的中心坐標(biāo) x = 32 y = 32 # 正方形的邊長(zhǎng) length = 64 # 計(jì)算半徑 r = length / 2 # 計(jì)算圓的左上角和右下角的坐標(biāo) left = x - r top = y - r right = x + r bottom = y + r draw.ellipse((left, top, right, bottom), fill=(0, 129, 255))
繪制文字到圖片,注意調(diào)整居中參數(shù)。
draw.text((4, 12), han_char, font=font, fill=(255, 255, 255))
將圖片傳遞到前端
這里我們使用 io 庫(kù)的 BytesIO 類將圖像轉(zhuǎn)換成字節(jié)流,示例代碼如下所示。
# 將圖像轉(zhuǎn)換成字節(jié)流 buf = io.BytesIO() image.save(buf, format='png') buf.seek(0) ???????return send_file(buf, mimetype='image/png')
除此之外,還使用了 send_file() 函數(shù)將字節(jié)流返回到前臺(tái)。
運(yùn)行完整代碼,在瀏覽器訪問(wèn)指定接口,得到下述圖片。
基于該內(nèi)容,可以擴(kuò)展更多參數(shù),由用戶自行配置,這里不再一一說(shuō)明。
到此這篇關(guān)于Python利用Flask動(dòng)態(tài)生成漢字頭像的文章就介紹到這了,更多相關(guān)Python Flask動(dòng)態(tài)生成漢字頭像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3.6實(shí)現(xiàn)連接mysql或mariadb的方法分析
這篇文章主要介紹了Python3.6實(shí)現(xiàn)連接mysql或mariadb的方法,結(jié)合實(shí)例形式分析了Python3.6針對(duì)mysql或mariadb數(shù)據(jù)庫(kù)操作的相關(guān)模塊安裝、數(shù)據(jù)庫(kù)與表的創(chuàng)建、數(shù)據(jù)庫(kù)連接等操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05Python實(shí)現(xiàn)簡(jiǎn)單http服務(wù)器
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單http服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04詳解設(shè)計(jì)模式中的工廠方法模式在Python程序中的運(yùn)用
這篇文章主要介紹了設(shè)計(jì)模式中的工廠方法模式在Python程序中的運(yùn)用,工廠方法模式主張程序在設(shè)計(jì)時(shí)要可以根據(jù)不同的條件生成各種類的實(shí)例,需要的朋友可以參考下2016-03-03Pytorch Tensor的統(tǒng)計(jì)屬性實(shí)例講解
今天小編就為大家分享一篇Pytorch Tensor的統(tǒng)計(jì)屬性實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python中filter與lambda的結(jié)合使用詳解
今天小編就為大家分享一篇Python中filter與lambda的結(jié)合使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12如何用python開(kāi)發(fā)Zeroc Ice應(yīng)用
這篇文章主要介紹了如何用python開(kāi)發(fā)Zeroc Ice應(yīng)用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01對(duì)Python3中列表乘以某一個(gè)數(shù)的示例詳解
今天小編就為大家分享一篇對(duì)Python3中列表乘以某一個(gè)數(shù)的示例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07