Python 製作枯燥的字符圖

之前有講過類似的文章[點這裏],但當時是保存爲TXT文檔類型,這當然也很OK,但是要對字符圖進一步操作就得存成圖像格式了。對TXT文檔截個圖??

在這裏插入圖片描述

真是個小機靈兒鬼。

在這裏插入圖片描述

其實可以運用PIL,把像素映射後的字符寫在自定義底色圖象上,然後保存不就結了??

對於圖像怎麼轉換(映射)到字符,還是文章開頭說的那篇古董文章[點這裏],,說的還算是清楚了吧

那就再囉嗦一下,順帶把事辦了

在這裏插入圖片描述

既然是字符畫,怎麼能沒有沒有字符串!

先弄一個字符串,建議按“濃密”程度手動排序,比如:

chrs = '@&$#%QPBMFHjlcvtuoi1+=-'
allc = len(chrs)#順便統計一下個數唄

要用的圖片路徑得有一個吧,輸出路徑得 有一個吧

img_path = r'c:\laal\beyond.jpg'
out_path = r'c:\laal\beyond_chrp.png'

要弄字符畫,得把像素與字符建立起來映射(說白了就是一對一的關係),但是,要是彩色(RGB之類的都夠嗆)的話,那還真不像標題那麼容易了,字符畫,字符寫出來,黑色的對吧(彩色的也有,但黑白更顯表格), 那吧圖片轉成黑白的不就完啦???哈哈哈

img = Image.open(img_path).convert('L')

黑色的字符有了,黑白的圖片有了,那然後呢????然後,然後建立對應關係唄,

  • 字符總數爲 allc(之前算了
  • 然而黑白圖的灰度【設爲gray】(理解爲顏色深淺程度就好)是0-255總共256個值
  • 那就分一下好了,每個字符負責一個灰度區間好了,區間長度如下:
per_span = 256/allc
如此,假設某一像素點灰度值爲gray,那麼它對應的字符在字符串中的索引位置就應該是 index = int(gray/per_span),到這裏,應該就可以明白爲什麼當初湊字符串的時候,建議按照“稠密”來排序了【灰度0-255 有黑到白】
那麼接下來的事還不是行雲流水嗎,
  • 第一部,紙尿褲 打開圖像並轉爲灰度圖(L模式)
from PIL import Image
img = Image.open(img.path).convert('L')
  • 第二部,沒騷話了 新建一原尺寸白底新圖像,再弄一個Draw對象用來在新圖上寫入字符
from PIL import ImageDraw
new_img = Image.new('RGB', img.size, (255,255,255))
draw = ImageDraw.Draw(new_img)
  • 第三部,刪除線根據設定好的字符大小,跳躍遍歷原圖像,並獲取相應點的灰度值,從而通過映射選取合適的字符寫入新圖對應座標
    for y in range(0, img.size[1], font_size):
        for x in range(0, img.size[0], font_size):
            gray = img.getpixel((x, y))
            char = chrs[int(gray//per_span)]
            draw.text((x, y), char, font=font, fill=chr_color, direction=None)

在這裏插入圖片描述

到此已經基本實現,只需要將new_img 進行保存就克


  • 完整代碼

'''
img         待轉換圖(Image對象
font_size   字符大小(默認15
up_size     源圖片放大倍數(默認1.1
bg          背景顏色(默認白
chr_color   字符顏色(默認黑
'''
def chr_im(img, font_size=15, up_size=1.1, bg=(255,255,255), chr_color='black'):
    chrs = '@&$#%QPBMFHjlcvtuoi1+=-'  # 字符集
    allc = len(chrs)
    per_span = 256 / allc

    font = ImageFont.truetype(r'c:\windows\fonts\simsun.ttc', font_size)
    img = img.resize((int(img.size[0]*up_size), int(img.size[1]*up_size)))
    img = img.convert('L')
    new_img = Image.new('RGB', (img.size), bg)
    draw = ImageDraw.Draw(new_img)
    for y in range(0, img.size[1], font_size):
        for x in range(0, img.size[0], font_size):
            gray = img.getpixel((x, y))
            char = chrs[int(gray//per_span)]
            draw.text((x, y), char, font=font, fill=chr_color, direction=None)
    return new_img

在這裏插入圖片描述

效果可以自己調節參數,顏色分辨率什麼的

在這裏插入圖片描述

做成了圖自然有很多玩法, 表白製作表情包什麼的,或者進一步製作字符動畫那也是很妙的
《魯迅 說》

在這裏插入圖片描述

PIL Image.paste() 透明像素問題

圖片變字符畫,其實很簡單

乾貨!Windows頻幕二維碼識別小工具

python 圖片拼接、圖片轉pdf

今日頭條美圖爬取,有你想要的

python 精美壁紙、簡單爬蟲,告別壁紙荒

Python 圖片拼心,表白利器

Python 以字成圖,花式表白,脫單趁早

奇妙的“字符26進制”

從視頻中提取圖像

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