程序員的浪漫 - 用她的名字作畫 Python 版

程序員的浪漫-用她的名字作畫Python版

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或者有更好的建議,歡迎批評指正,不吝感激

QrCode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章