實戰(zhàn) | 用 Python 輕松制作好看的心型照片墻

人生苦短唇敞,我用Python!今天分享如何用Python制作好看的心型照片墻咒彤。

一疆柔、效果

我們先來看下效果圖,了解我們接下來要做的事情镶柱,我的效果圖如下:


圖片.png

感覺如何旷档?如果還滿意,看完幸苦點個贊奸例,因為看完你也可以做出來彬犯!同時也是對我的一種反饋

二向楼、思路

上代碼之前,我們先來理清下思路谐区,只有過程理清楚了湖蜕,才能得到自己的想要的結(jié)果

制作這個我覺得最難的地方就在于每個圖片的位置該怎么計算,才能湊成一個心型宋列。但是沒關(guān)系昭抒,我們不去計算,畢竟我數(shù)學(xué)很差炼杖,我采用土辦法灭返,直接把它位置寫死,雖然稍微有點麻煩坤邪,但是靈活~

大家都知道excel吧熙含,里面的表格是由一個個單元格組合而成,那請你也把上面的圖想象成表格艇纺,是由很多單元格組成的怎静,單元格的大小就是圖片的尺寸,并且去掉了邊框黔衡。那么制作這個心型蚓聘,只要在單元格內(nèi)添加單個圖片,然后湊成心的形狀就完成了盟劫。這就是整體的思路夜牡,接下來用代碼去實現(xiàn)這個思路

三、準(zhǔn)備

我先說下制作過程要使用哪些Python庫侣签,工具總要先搞好塘装,不然搞個der~

  • 1、pillow:用來處理圖片的庫硝岗,屬于第三方庫氢哮,需要額外安裝 pip install pillow
  • 2、os:用來獲取圖片型檀,python自帶冗尤,不用額外安裝
  • 3、math:用來計算圖片數(shù)量胀溺,python自帶裂七,不用額外安裝

有上面三個庫就可以了,接下代碼走起仓坞。

四背零、代碼

1、導(dǎo)庫

from PIL import Image
import os
import math

2无埃、制作形狀

我們通過二維數(shù)組確定圖片的位置徙瓶,每個元素相當(dāng)于excel中的單元格:1代表空白毛雇,0代表圖片≌煺颍看到由0組成的愛心了嘛灵疮?這里純手打(所以你可以自由改動,做出你想的形狀壳繁,這就是靈活的地方~)

因為我圖片有500張震捣,所以我想做大一點,放更多的圖片闹炉,所以元素的個數(shù)會比較多蒿赢,下面是21x21的大小。

記自ァ:0的個數(shù)一定要比你的圖片數(shù)量少或剛好相等羡棵,否則就不是一個完整的愛心了!

map = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
    [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
    [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
    [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]

3昵观、導(dǎo)入圖片

位置確定好了晾腔,開始獲取所有的圖片:

# 這個是我圖片的所在路徑
img_dir = r"C:\Users\admin\Desktop\頭像"
# 獲取這個文件下的所有文件,因為沒有過濾其他類型文件啊犬,所以不要放非圖片文件
# 返回的是一個列表
imgs = os.listdir(img_dir)
# 設(shè)置圖片的尺寸,所有圖片尺寸要保持統(tǒng)一壁查,要有組織有紀(jì)律
img_h = img_w = 192
# 計算行數(shù)觉至,即子列表的個數(shù)
rows = len(map)
# 計算列數(shù),即子列表中元素的個數(shù)
columns = len(map[0])

4睡腿、畫圖

接下來就是準(zhǔn)備一個白色的背景语御,當(dāng)作畫布。有了行數(shù)席怪、列數(shù)和圖片的寬高应闯,就可以計算出整個畫布的尺寸了

# 第一個參數(shù)照著寫
# 第二個參數(shù)需要傳入一個元組,元組的第一個參數(shù)是畫布的寬挂捻,第二個是高
# 第三個參數(shù)傳入的是畫布的顏色
# 使用Image.new()方法創(chuàng)建一個畫布
figure = Image.new("RGB", (img_w*columns, img_h*rows),"white")

到目前為止碉纺,圖片和畫布都已經(jīng)準(zhǔn)備好了,現(xiàn)在就是將圖片放置在畫布對應(yīng)的位置上了刻撒,即數(shù)組中元素為0的位置骨田。

# 表示圖片的下標(biāo)
count = 0
# 遍歷行
for i in range(len(map)):
    # 遍歷每行中的所有元素
    for j in range(len(map[i])):
        # 如果元素是1,就不管它
        if map[i][j] == 1:
            continue
        # 如果元素是非1声怔,即0就放圖片上去
        else:
            # 做個異常處理态贤,防止有些圖片打開失敗,導(dǎo)致程序中斷
            try:
                # 使用Image.open("圖片路徑")方法獲取圖片對象
                image = Image.open(os.path.join(img_dir, imgs[count]))
            except:
                continue
            # resize((新的寬醋火,新的高))用來改變圖片的尺寸,接收一個元組
            image = image.resize((img_w, img_h))
            # 將修改尺寸后的圖片(image)粘貼(paste)到畫布(figure)上
            # 第一個參數(shù) 是圖片對象
            # 第二個參數(shù)是 圖片在畫布上的位置悠汽,相當(dāng)于單元格的位置
            figure.paste(image, (img_w*j, img_h*i))
            # 使用完一張圖片就要記錄下來箱吕,并開始使用下一張圖片
            count += 1

# 當(dāng)循環(huán)結(jié)束,即表示心型照片圖已經(jīng)完成
# 將畫好的畫布顯示出來柿冲,給你看到
figure.show()
# 不滿意在調(diào)整二維數(shù)組中0的位置茬高,滿意可以保存到本地,用來裝逼
# 需要告知程序圖片保存的路徑
figure.save('心型照片墻.png')

到此姻采,心型照片墻就制作出來了雅采,如果你有女朋友,可以用自己女朋友的照片慨亲,背景用紅色婚瓜,然后發(fā)給你女朋友看,會不會更愛你我就不知道了,也可以寫個i love you~(圖如下)刑棵“涂蹋可惜我沒有,好氣哦蛉签!


圖片.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胡陪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碍舍,更是在濱河造成了極大的恐慌柠座,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件片橡,死亡現(xiàn)場離奇詭異妈经,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捧书,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門吹泡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人经瓷,你說我怎么就攤上這事爆哑。” “怎么了舆吮?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵揭朝,是天一觀的道長。 經(jīng)常有香客問我歪泳,道長萝勤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任呐伞,我火速辦了婚禮敌卓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伶氢。我一直安慰自己趟径,他們只是感情好瘪吏,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜗巧,像睡著了一般掌眠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幕屹,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天蓝丙,我揣著相機(jī)與錄音,去河邊找鬼望拖。 笑死渺尘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的说敏。 我是一名探鬼主播鸥跟,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盔沫!你這毒婦竟也來了医咨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤架诞,失蹤者是張志新(化名)和其女友劉穎拟淮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谴忧,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡惩歉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俏蛮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡上遥,死狀恐怖搏屑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粉楚,我是刑警寧澤辣恋,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站模软,受9級特大地震影響伟骨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜燃异,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一携狭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧回俐,春花似錦逛腿、人聲如沸稀并。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碘举。三九已至,卻和暖如春搁廓,著一層夾襖步出監(jiān)牢的瞬間引颈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工境蜕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蝙场,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓汽摹,卻偏偏與公主長得像李丰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逼泣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容