網站首頁 編程語言 正文
基礎環(huán)境配置
再 Python 的 Flask 框架中,我們使用 Python 的圖片處理庫(例如 Pillow)來生成一個漢字圖片。
首先看一個簡單的示例,然后再此基礎上,進行細節(jié)優(yōu)化。
提前安裝 PIL 模塊
pip install pillow
接下來的視圖函數(shù)和代碼框架,可參考爬蟲訓練場系列博客中的任意一篇,這里橡皮擦在 app/apis 目錄的 index.py 文件中進行操作。
建立基礎代碼結構,如下所示:
@api.route('/avatars')
def index():
# 生成隨機漢字
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')}
# 使用字符映射表去除標點符號
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))
# 將圖片轉換為二進制數(shù)據(jù)
image_binary = image.tobytes()
# 設置響應頭,返回圖片
response = make_response(image_binary)
response.headers['Content-Type'] = 'image/jpeg'
return response
此時的代碼是不能正確返回圖片的,里面存在很多問題,需要一一進行修改。
加載本地 txt 文件,用于隨機生成漢字
第一個問題 demo.txt 被我放置在 static 文件夾中,直接讀取肯定是無法讀取到的,需要用到 os 庫。
# 獲取根目錄
app_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 拼接 static 文件夾路徑
static_path = os.path.join(app_root, 'static')
此時可以讀取本地字體文件,代碼如下所示:
os.path.join(static_path, 'demo.txt')
讀取完畢,根目錄變量 app_root 要放到內部函數(shù)外,后續(xù)還要使用。
由于我們需要兩個漢字,所以使用最簡單的字符串拼接,準備好 2 個漢字。
# 可以生成任意內容
han_char1 = get_random_common_char()
han_char2 = get_random_common_char()
han_char = han_char1 + han_char2
Pillow 生成圖片
在 Flask 中生成圖片非常簡單,稍微麻煩的是直接將圖片以二進制流格式返回到前端。
圖片生成的代碼如下所示。
# 生成圖片
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() 方法,其語法結構如下所示。
Image.new(mode, size, color=0)
其各參數(shù)含義如下:
- mode:圖像模式。例如:‘RGB’、‘RGBA’、‘L’ 等。
- size:圖像大小,以像素為單位。例如:(800, 600)。
- color:圖像背景色。例如:(255, 255, 255)。
這里加載了本地字體文件 msyh.ttf,后續(xù)大家可以去 GitCode 進行下載。
除此之外,為了達到最終效果,還需要繪制一個同心圓。
# 繪制一個圓形
# 正方形的中心坐標
x = 32
y = 32
# 正方形的邊長
length = 64
# 計算半徑
r = length / 2
# 計算圓的左上角和右下角的坐標
left = x - r
top = y - r
right = x + r
bottom = y + r
draw.ellipse((left, top, right, bottom), fill=(0, 129, 255))
繪制文字到圖片,注意調整居中參數(shù)。
draw.text((4, 12), han_char, font=font, fill=(255, 255, 255))
將圖片傳遞到前端
這里我們使用 io 庫的 BytesIO 類將圖像轉換成字節(jié)流,示例代碼如下所示。
# 將圖像轉換成字節(jié)流
buf = io.BytesIO()
image.save(buf, format='png')
buf.seek(0)
???????return send_file(buf, mimetype='image/png')
除此之外,還使用了 send_file() 函數(shù)將字節(jié)流返回到前臺。
運行完整代碼,在瀏覽器訪問指定接口,得到下述圖片。
基于該內容,可以擴展更多參數(shù),由用戶自行配置,這里不再一一說明。
原文鏈接:https://dream.blog.csdn.net/article/details/128583823
相關推薦
- 2022-04-17 Jquery cxSelect多級聯(lián)動下拉組件的使用
- 2022-08-10 pandas函數(shù)isnull的具體使用_python
- 2022-12-26 python如何修改圖像的分辨率_python
- 2022-06-22 如何使用?Dockerfile?創(chuàng)建一個簡單容器_docker
- 2022-07-29 Docker容器的加載分層原理及commit鏡像_docker
- 2023-02-15 docker無法刪除鏡像報Error:?No?such?container的錯誤問題_docker
- 2022-06-21 c語言詳解動態(tài)內存分配及常見錯誤的解決_C 語言
- 2022-09-07 GoLang使goroutine停止的五種方法實例_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支