hello,大家好,我是一灰灰,之前介紹了一篇使用她的名字來畫出她的美圖的文章,其中主要使用的Java來實現的,今天呢,我們再來用Python來實現一下
同樣最終的代碼量也不會超過三十行
上篇博文超鏈:* 程序員的浪漫-用她的名字作畫Python版 - 一灰灰Blog
1. 環境相關
這裏我們選擇python來作爲我們的主要繪圖武器,至於python的環境安裝相關的這裏就不介紹了,有興趣的小夥伴自行探索
再python界,操作圖片的利器PIL,相信大夥也都清楚,接下來將使用它來實現我們的目標
安裝依賴
pip install Pillow
2. 基本知識點
再正式開始之前,給不太熟悉PIL操作的小夥伴,簡單介紹一下它的基本用法,當然也會重點突出一下我們將採用的幾個方法
2.1 加載圖片
from PIL import Image
img = Image.open("圖片地址")
是的,就這麼簡單,直接使用 Image.open()
就可以讀取圖片了
2.2 圖片基本信息獲取
獲取圖之後,通常需要關注的幾個參數,如寬高,通道
width, height = img.size
# RGBA 表示包含透明度,如png
# RGB 不包含透明度,如jpg
mode = img.mode
2.3 創建畫板,用於編輯
如果我們想在這個圖片上進行繪製信息,或者說希望創建一個空的畫板,那麼我們就先需要獲取到一個ImageDraw對象
from PIL import ImageDraw
# 獲取圖片對應的畫板
draw = ImageDraw.Draw(img)
上面獲取到draw對象之後,就可以根據它提供的各種方法,來繪製各種幾何圖形、文字、圖片等;如果我們希望獲取一個空的畫板,可以怎麼操作呢?
# 創建一個待透明度的圖,第二個元組參數爲圖的寬高,第三個表示背景全透明
new_img = Image.new("RGBA", (width, height), (255, 255, 255, 0))
ImageDraw提供了很多繪圖的方法,下面給出一些常用的case,就不重點敘述了
new_img = Image.new("RGBA", (480, 640), (255, 255, 255, 0))
# 創建繪製對象
draw = ImageDraw.Draw(new_img)
# 從 (10, 10) -> (100, 100) 畫一條黃色直線
draw.line((10, 10, 100, 100), 'red')
# 繪製矩形 (100, 110) -> (200, 200),黑色填充,黃色填充
draw.rectangle((100, 110, 200, 200), 'black', 'red')
# 繪製橢圓
draw.ellipse((300, 300, 500, 400), 'yellowgreen', 'red')
# 園
draw.ellipse((250, 250, 350, 350), 'seagreen', 'red')
# 繪製文本,選擇宋體,字體大小爲28,uniquecode編碼
font = ImageFont.truetype("simsun.ttc", 28, encoding="unic")
draw.text((300, 200), u'一灰灰Blog', 'red', font)
重點關注繪製文本這裏,draw.text((x,y), "文字", "文字顏色", 字體)
, 這就是接下來要使用的方法
2.4 獲取像素
如果我們希望獲取指定座標的RGB值,如下操作即可
pixel = img.getpixel((x, y))
看到這裏的小夥伴,結合前一篇博文,要想實現python版的用她的名字繪圖,相信就很簡單了吧
2.5 預覽和保存圖片
# 展示圖片
new_img.show()
# 保存圖片
new_img.save("save.png")
3. Python版文字繪圖
接下來,進入正式的實現
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
def render(path: str, name: str, save: str):
img = Image.open(path)
width, height = img.size
# 創建畫板,放大24倍
new_img = Image.new("RGBA", (width * 24, height * 24), (255, 255, 255, 0))
draw = ImageDraw.Draw(new_img)
# 加載自定義字體,字體文件來自 https://www.diyiziti.com/Builder/446
font = ImageFont.truetype(u"D://MobileFile/瀟灑手寫體.ttf", 20, encoding="unic") # 設置字體
render_index = 0
for x in range(width):
for y in range(height):
pixel = img.getpixel((x, y))
draw.text((x * 24 + 2, y * 24 + 2), name[render_index], pixel, font) # 再指定的地方使用文字替代之前的純色
render_index = (render_index + 1) % len(name)
new_img.save(save)
依然以小黃人爲例,來看下生成的效果如何
從上面的圖片來看,和前面java版輸出差不離,有興趣的小夥伴動手搞起來吧;我是一灰灰,覺得不錯的小夥伴給個收藏、點贊、評論支持一下唄
一灰灰的聯繫方式
盡信書則不如無書,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
- 個人站點:https://blog.hhui.top
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
- 微信公衆號:一灰灰blog