
作者:豆豆
來源:Python 技術
我們都知道當把圖片無限放大時,就會看到一個個的小方格,而這每一個小方格就是組成圖片的最小單位,我們稱之為像素,換言之,對于單獨的一個像素來說,它只有一個固定的色值,是不可再分的。
大膽一點,如果我們在這每一個像素塊中填充上不同的字以組成你想說的話,然后再發(fā)給你心中的那個她,會不會有意外的驚喜呢。
先從原理上來講講此方案為啥可行,拋開整張圖片不談,先單獨看下這一個像素塊。
一個像素點其大小是 1 x 1 像素,但要想把一個這么大的字裝進這么小的像色塊里面,即使能裝進去,放大之后也是很難看清楚的,更別說后面的驚喜了。
因此,我們需要將像素塊放大,放大到足夠看清字體為止,經(jīng)過派森醬多次測試發(fā)現(xiàn) 15 倍足矣,再小的話字體就非常模糊了。
同時因為每個像素塊都是有自己的色值的,所以當我們把像素放大到 15 x 15 時,要填充上對應顏色的文字才行。
處理好這一個像素點,再對其余所有像素點都采取同樣的操作即可,這樣最后得到的圖片會是原來的 15 倍大,但從宏觀來看圖片的色值并不會有任何改變。
由于要對圖片進行操作,我們用到的庫是 Pillow,可直接通過 pip 進行安裝。
pip install Pillow
為了故事的順利發(fā)展,需要先熟悉幾個 Pillow 的常規(guī)操作。
1、新建圖片并保存
from PIL import Image
img = Image.new("RGB", (512, 512), (0, 100, 200)) # 創(chuàng)建一張新的圖片 Image.new(mode, size, color=0) img.save("img.png")
效果如下所示:
2、重新繪制圖片
我們可以在上面剛生成的圖片中繪制一些線條,此處是勾畫出兩條對角線。
from PIL import Image
img = Image.open("img.png") # 打開圖片 draw = ImageDraw.Draw(img) # 取得繪圖對象,用于繪制對角線 draw.line((0, 0, img.size[0], img.size[1]), fill=128, width=2)
draw.line((0, img.size[1], img.size[0], 0), fill=128, width=2)
img.save("img-line.png")
效果如下所示:
3、圖片合并
我們還可以將一張圖片合并到另一張圖片之上,看起來就像是粘上去的一樣。
from PIL import Image
img = Image.open("img.png") # 打開圖片 img_small = Image.new("RGB", (32, 32), 'red') # 創(chuàng)建圖片 img.paste(img_small, (20, 20)) # 將 img_small 粘貼到 img 的 (20,20) 位置處 img.save("img-paste.png")
效果如下所示:
有了以上的基礎,接下來就直接上手開干了。
首先我們找了一張月亮的圖片,然后準備把「今晚的月色真美」填充到圖片中。當然此處對內容做了簡化,你完全可以將任何自己想告訴對方的話寫進去。
首先定義好要用到的基本變量,像素放大尺寸 img_child_size、內容、字體設置、圖片路徑等。
from PIL import Image, ImageDraw, ImageFont
img_child_size = 15 text = "今晚的月色真美" font = ImageFont.truetype('AliPuHui-Bold.ttf', img_child_size)
img_path = './moon.png'
其次創(chuàng)建一個大小為 img_child_size 的小圖 img_child 用于填充字體,一個原始圖片擴大 img_child_size 倍的新圖 img_ans 用于裝載前面填充好字體的小圖。
img = Image.open(img_path)
img_w, img_h = img.size
img_child = Image.new("RGB", (img_child_size, img_child_size))
img_ans = Image.new("RGB", (img_child_size * img_w, img_child_size * img_h))
最后,就是循環(huán)遍歷原圖的每一個像素點,針對每個像素點(x,y)都要用繪制好文字的小圖 img_child 粘貼到新圖 img_ans 的對應位置上去。當然其中為了讓字體居中還做了一些處理。
text_w, text_h = font.getsize("中") # 獲取單個文字的寬、高 offset_x = (img_child_size - text_w) >> 1 # 文字水平居中 offset_y = (img_child_size - text_h) >> 1 # 文字垂直居中 char_index = 0 draw = ImageDraw.Draw(img_child) # 小圖的繪圖對象,用于繪制文字 for x in range(img_w): # 寬在外 高在內,因此文字的方向是從左到右,從上到下排列的 for y in range(img_h): draw.rectangle((0, 0, img_child_size, img_child_size), fill='lightgray') # 繪制背景,看起來會好一些 draw.text((offset_x, offset_y), text[char_index], font=font, fill=img.getpixel((x, y))) # 用(x,y)處像素點的色值繪制字體 img_ans.paste(img_child, (x * img_child_size, y * img_child_size)) char_index = (char_index + 1) % len(text) img_ans.save('moon-text.png')
來看看最終結果。
看不是很清楚對不對,咱放大看。
有點意思了對不對,繼續(xù)放大。
哈哈哈,驚不驚喜,意不意外。
今天派森醬帶大家一起搞了個好玩的,用文字來填充圖片,只要理解了圖片、像素、文字之間的關系代碼就很容易寫出來了。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉換:從基礎用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結構數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結構數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結構數(shù)據(jù)特征價值的專業(yè)核心 表結構數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結構化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據(jù)分析與統(tǒng)計學領域,假設檢驗是驗證研究假設、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結構數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結構數(shù)據(jù)(以 “行 - 列” 存儲的結構化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結構數(shù)據(jù)價值的核心操盤手 表格結構數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據(jù)把關的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10