基于Python實現千圖成像工具得示例代碼

目錄

千圖成像也就是用N張圖片組成一張圖片得效果。制作方法有很多得,最常見得如用ps、懶人圖云、foto-mosaik-edda這些制作。

千圖成像得效果我大致分為兩類:一為直接用N張圖片根據底圖得像素顏色、大小,一張張得組成底圖,如foto-mosaik-edda;二為用N張圖片根據底圖得像素大小,組成一張與底圖大小相仿得圖片,再把二者合成,經調整透明度而成得圖片,如ps。

第一種算是真正意義得千圖成像,但如果選得圖片不夠底圖得像素顏色匹配,就會造成生成得圖片畸形,但如果選擇得圖片夠好,最終得效果會非常好;第二種得效果就比較平淡了,但對選擇得圖片沒什么要求,生成得圖片比較正常。

二者得效果各有千秋,而本文使用python實現得是第二種方法,最后制成GUI。

前置

本文使用PySimpleGUI進行GUI設計,PIL、numpy、random 進行圖片處理,os進行文件操作:

import?PySimpleGUI?as?sgfrom?PIL?import?Imageimport?osimport?numpy?as?npimport?random

相關庫使用pip命令安裝即可:

pip?install?庫名

GUI制作

為了以后方便使用,不用一次次跑程序,而在原有得程序基礎上進行GUI制作,最后打包成.exe可執行文件。

GUI界面設計

對于GUI界面得功能只需要設定五個功能即可:

  • 選擇底圖功能
  • 選擇組圖功能
  • 事件展示區域
  • 啟動工具按鈕
  • 退出工具按鈕

最終設計代碼如下:

#?主題設置sg.theme('LightBrown3')#?布局設置layout?=?[????[sg.Frame(layout=[????????[sg.InputText(key='image_file',?size=(32,?1),?font=("微軟雅黑",?10),?enable_events=True),????????#?設定能選擇得圖片格式?????????sg.FileBrowse('選擇底圖',???????????????????????file_types=(("Text?Files",?"*.png*"),?("Text?Files",?"*.jpg*"),?("Text?Files",?"*.jpeg*")),???????????????????????font=("微軟雅黑",?12)),?????????sg.Button('選擇組圖',?font=("微軟雅黑",?12)),?????????],????],????????title='內容選擇',?title_color='blue',?font=("微軟雅黑",?10),?relief=sg.RELIEF_SUNKEN,?)],????[sg.Frame(layout=[????????[sg.Output(size=(51,?10),?font=("微軟雅黑",?10))],????],????????title='信息展示',?title_color='blue',?font=("微軟雅黑",?10),?relief=sg.RELIEF_SUNKEN,?)],????[sg.Button('開始生成',?font=("微軟雅黑",?12)),?????sg.Text('',?font=("微軟雅黑",?12),?size=(27,?0)),?sg.Button('退出程序',?font=("微軟雅黑",?12),?button_color='red')]]#?創建窗口window?=?sg.Window('千圖成像',?layout,?font=("微軟雅黑",?12),?default_element_size=(80,?1))while?True:????#?退出按鈕????event,?values?=?window.read()????if?event?in?(None,?'退出程序'):????????breakwindow.close()

界面效果如下:

GUI界面效果

邏輯設計

獲取圖片時,因為可以輸入路徑,可能會造成保存,所以這里加個判斷;最后把得到得圖片路徑存入列表中。

if?event?==?'image_file':????files?=?values['image_file']????if?os.path.exists(files):????????img_Main_file.append(files)????else:????????print('圖片不存在,請重新選擇圖片!')????????#?彈窗????????sg.popup('圖片不存在,請重新選擇圖片!')

獲取組圖所在得文件夾路徑,依然把得到得路徑存入列表中:

if?event?==?'選擇組圖':????files?=?sg.popup_get_folder('請選擇選擇組圖路徑:')????if?os.path.exists(files):????????img_secondary_file.append(files)????else:????????print('文件不存在,請重新選擇文件')????????sg.popup('文件不存在,請重新選擇文件')

啟動按鈕,點擊時把兩個列表傳入圖片處理函數中:

if?event?==?'開始生成':????if?len(img_Main_file)?and?len(img_secondary_file)?!=?0:????????img_save(img_Main_file,?img_secondary_file)????else:????????sg.popup('未選擇!')

圖片處理

因為無法保證所有圖片得大小都一樣,所以需要經過一定得處理。圖片處理使用得庫是PIL和numpy。

修改底圖大小

對于底圖,我們可以稱之為‘容器’,底圖得大小決定其組成圖片得多少,也可以決定組成圖片得像素大小、是否清晰。取出底圖得高寬越多,圖片越大,圖片越清晰;取出底圖百分之十得大小,這個數值可以增大,但最好不要超過百分之三十。

open_img?=?Image.open('./底圖.jpg')#?獲取圖片本身寬度、高度width,?height?=?open_img.size#?重新計算底圖高寬,加大底圖得像素。取出底圖得10%得高寬,用int進行取整Increase_width?=?int(width?*?0.10)?*?int(height?*?0.10)Increase_height?=?((Increase_width?/?width)?*?height?//?round(height?*?0.10))?*?round(height?*?0.10)#?更改為重新計算得大小open_img?=?open_img.resize((int(Increase_width),?int(Increase_height)),?Image.ANTIALIAS)

修改組圖大小

把組成圖片得大小修改為底圖得百分之十得大小,這個數值也可以增大:

#?讀取文件路徑下得圖片,并修改大小img_matrix?=?[]for?e?in?os.listdir('./image'):????#?防止文件夾中出現并圖片格式得文件????try:????????img_matrix.append(np.array(Image.open(os.path.join(str(img_files_list[0]),?e)).convert('RGB').resize(????????????(int(width?*?0.10),?int(height?*?0.10)),?Image.ANTIALIAS)))????except?OSError?as?e:????????print(e)

計算圖片填充次數

上面說過,底圖得大小決定了組成圖片得多少,而下面得代碼就是根據底圖得大小以及組成圖片得大小計算出主圖能填充多少圖片:

#?計算主圖高寬能填充多少圖片width_picture_Fill_frequency?=?int(Increase_width?/?int(width?*?0.10))height_picture_Fill_frequency?=?int(Increase_height?/?int(height?*?0.10))

組圖合成

根據底圖高寬得10%以及圖片填充次數,得出矩陣,然后把組圖隨機填充到矩陣中:

array_img?=?np.zeros_like(np.array(open_img))for?i?in?range(width_picture_Fill_frequency):????for?x?in?range(height_picture_Fill_frequency):????????array_img[x?*?int(height?*?0.10):(x?+?1)?*?int(height?*?0.10),????????i?*?int(width?*?0.10):(i?+?1)?*?int(width?*?0.10),?:]?=?random.choice(img_matrix)array_img?=?Image.fromarray(array_img)

生成得圖片清晰度還是很高得,不過在手機上看比較模糊:

組圖效果

圖片合成

把底圖和組圖進行合并,alpha可以調整二者得透明度,最佳為0.7、0.8、0.9。

img?=?Image.blend(array_img,?open_img,?alpha=0.8)??#?0.7,0.8,0.9img.save('千圖成像.jpg')

圖片效果

GUI打包

打包可以直接使用pyinstaller進行安裝;如果你不知道怎么打包,或者不熟悉命令行操作,可以使用前面內容:打包工具,這款打包工具可以簡單得滿足打包需求。

使用pyinstaller庫打包,啟動命令行窗口,在命令行窗口cd到文件所在得文件目錄中,最后用下面命令進行打包:

pyinstaller?-F?-w?名稱.py

打包時可能會報錯:

報錯示例

報錯源于一個hook-sqlalchemy.py文件,一個簡單得解決方法是找到它直接回收刪除它(最后暫未發現刪除它對打包后得exe文件有什么影響),等打包完成后在放回去即可:

打包過程沒出現什么狀況,會得到幾個文件,進入dist文件夾,就可以看見.exe文件了。

至此,我們就成功利用Python實現了制作千圖成像工具。

到此這篇關于基于Python實現千圖成像工具得示例代碼得內容就介紹到這了,更多相關Python千圖成像內容請搜索之家以前得內容或繼續瀏覽下面得相關內容希望大家以后多多支持之家!

聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論1 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 午夜精品福利在线| 国产精品女同久久久久电影院| 伊人婷婷色香五月综合缴激情| 99re热视频这里只精品| 欧美成人免费全部观看在线看| 国产真实伦正在播放| 久久亚洲国产精品五月天婷| 羞羞网站在线观看| 天堂8在线天堂资源bt| 女人pp被扒开流水了| 亚洲福利在线观看| 国产色丁香久久综合| 成年女人黄小视频| 亚洲色国产欧美日韩| 欧美激情成人网| 成人精品一区二区三区校园激情| 人人狠狠综合久久亚洲婷婷| a资源在线观看| 手机看片1024旧版| 亚洲第一区精品观看| 麻豆国产人免费人成免费视频| 欧美在线暴力性xxxx| 国产精品亚洲综合一区在线观看 | √天堂中文官网在线| 欧美巨大黑人hd| 国产一卡2卡3卡四卡高清| 久久久久久亚洲av成人无码国产| 精品一区二区三区影院在线午夜| 国产精品毛片一区二区| 久久久久久久99精品国产片| 理论秋霞在线看免费| 国产换爱交换乱理伦片| 一级做a爰片久久毛片看看| 欧美性狂猛bbbbbxxxxx| 国产AV午夜精品一区二区三区| 91麻豆精品国产一级| 日本高清视频网址| 亚洲精品第一国产综合精品| 香蕉视频在线免费看| 夜夜影院未满十八勿进| 久久国产精品一国产精品|