【正經的AI on Python入門系列】0.來學點Python吧!從一個鬥圖小工具開始

Before The Beginning

    近年,技術圈炒的最火的兩個話(ba)題(gua)不外乎就是人工智障智能以及炒幣區塊鏈了,這個系列文章我主要以一個小菜鳥的角度一步一步的對人工智能的相關知識作一點了解,也算是一個顫顫巍巍追着AI浪潮公交車的社會主義五好青年,咳咳,扯遠了...其實對於人工智能,嚴格意義上更多的是一個科學領域的課題,其中更多的是數學、語言學、社會學、神經科學的研究內容,對於咱們這種社會底層的小碼農想要進入這個領域每每可能面臨的是一大堆的專業名詞,一大堆的技術論文,一大堆公開課還有一大堆的不知道到底搞懂沒有可是吹的很牛逼的培訓機構講師,門都沒入就被各類忽悠到西伯利亞去了。
    所以,本文將會以一些正經的嚴謹的有深度的(大概吧)的課題,慢慢的接觸人工智能的相關知識。java

Why Python?

    提起人工智能,就不得不提Python語言,但實際上Python不是什麼新東西,反而這是一門至關老的語言了起源甚至能夠追溯到80年代末90年代初,那爲什麼它會在人工智能這個風口獨領風騷佔據了半壁江山呢?Python的特色整體能夠概括成如下幾點:python

  • 成熟完善的社區——比起go、koltin之類的新興語言,相關資料簡直是好找一個數量級
  • 大量的庫——其中包括了Python的庫、用Python包裝的C/C++庫、甚至各類語言的庫
  • 與生俱來的C/c++互操做性——其實不止C,Python與不少語言都具有良好的互操做性,膠水語言的大名不是白叫的
  • 語法簡單優雅——Python的哲學就是簡單,甚至某些問題只會提供你惟一的解決方案,不夠靈活但簡單啊!並且,對於一些不是計算機專業人士來講,他的語法可能更接近天然語言,更容易被接受,並且是真正的編程語言(它的競爭對手——各類Shell腳本語言哭暈在廁所)

Hellow World!

好的,按照國際管理,咱們先用python來寫個hellow worldc++

P.S. 本文基於Python3,並且一些語法細節也不會一一講解,更完整的語法還請查閱官網文檔!如非特殊狀況的話仍是更推薦你們學習Python3,至於Python2跟Python3的區別就不在贅述了。

建立項目文件

Python源碼以.py爲後綴,如下爲一個最簡例子:git

example-1: helloWorld.pygithub

# -*- coding:utf-8 -*-
#__author__ = 'akers'

print("hellow world !")

沒錯,就是這麼簡單!用python helloWorld.py運行,就能看到打印的Hellow World了!(沒錯,我單詞打錯了,僅此一家,版權全部,若有雷同,純屬巧合,本人不保留追究權利!)
由於Python柔和了面向對象、面向過程、函數式編程等多種編程方式,所以相似這種直接在源文件中書寫命令也是支持的,這種寫法在製做一些小工具、小腳本、小實驗的時候很是很是的方便,但咱們要嚴謹一點對吧,因此咱們再來個正經點的:編程

Python中的main函數

如下爲一個Python的main方法的最簡例子:
example-1: hello_world_main.pywindows

# -*- coding:utf-8 -*-
#__author__ = 'akers'

if __name__ == "__main__":
    print("hellow world !");

在上面例子中的if __name__ == "__main__":即爲平時咱們熟知的main方法了,那至於一些以爲這個很彆扭的,看不慣的,可使用以下這種格式的:編程語言

# -*- coding:utf-8 -*-
#__author__ = 'akers'

import sys #包導入

# 常見的main函數定義
def main(argv=[]):
    print("hellow world: ", argv)


# 你看不到我,你看不到我
if __name__ == "__main__":
    main(sys.argv) # sys.argv獲取命令行參數

這樣是否是就親切不少了呢,跟你熟悉的java和c是否是就同樣同樣了呢....額....你說那個__name__啥的,沒事你就當沒看見了!啊?你問這個__name__是什麼?其實它是一個內置變量,若是是直接執行的話,編譯器會傳入"main"若是是做爲包引入,會傳入包名。
而後,本期文章就到此結束了,纔怪!下面讓咱們把HelloWorld完善一下函數式編程

更高大上的hello world

首先,咱們準備兩個素材

先準備一個底圖
圖片描述函數

而後請出——————————館長大人:
圖片描述

而後,使用PIL庫組合一下它們

PIL是Python的一個視覺處理庫,目前已經中止維護了,但它後繼有人啊,pillow庫fork了它,所以通常咱們說PIL的時候,實際上用的是pillow
Python的外部依賴,須要經過pip工具進行安裝,而後才能在代碼裏import到相應的包,下面以安裝過pillow爲例:

pip install pillow

引入依賴包

from PIL import Image,ImageDraw,ImageFont

加載圖片

#導入表情背景
background=Image.open('./resources/background/pander/default.png')
#導入表情
faceImg=Image.open('./resources/face/jgz/laugth.png')

組合圖片

#建立底圖
target=Image.new('RGBA', (250, 250), (0, 0, 0, 0))
#表情背景貼到底圖上
target.paste(background, (0,0))
#表情圖貼在合適的位置上,注意啊,別擋到背景圖
target.paste(faceImg, (62,37))

加上點文字

#ImageDraw爲PIL的繪圖模塊
draw = ImageDraw.Draw(target)
#設置字體
font = ImageFont.truetype('./resources/msyh.ttc', 30)
#底圖上的10,200位置寫入文字
draw.text((10, 200), argv[1],fill='black', font=font)

上面的argv[1]就是取第一個命令行參數

走你!

運行一下咱們腳本:

python emofigther.py "Hellow World!"

而後,你就會獲得一個Hellow World!(沒錯,我依然打錯單詞了!)
圖片描述

隨便再擴展一下

我相信大家的鬥圖之魂已經有點按耐不住了,可是等等,如今生成的圖片還獲得output文件夾找,很是不方即是吧,能不能實如今運行腳本後,生成的圖片自動放到剪貼板呢?固然能夠!咱們能夠用pywin32這個package,他提供了一套用python封裝的win32庫(windows應用開發的一套底層庫)接口。

from io import BytesIO
import win32clipboard as clip
import sys, platform, win32con

if 'Windows' in platform.platform() or 'windows' in platform.platform():
    # 打開字節流
    output = BytesIO()
    # 打開剪貼板
    clip.OpenClipboard() 
    # 先清空剪貼板
    clip.EmptyClipboard()
    # 將圖片保存到字節流
    target.save(output, format="BMP")
    # 去掉字節流中的前14個字符(BMP位圖文件頭)
    data = output.getvalue()[14:]
    # 將圖片放入剪貼板,這裏是不帶文件頭的數據
    clip.SetClipboardData(win32con.CF_DIB, data) 
    clip.CloseClipboard()
    output.close()

而後再運行下咱們的emofigther

python emofigther.py "Ctrl-V大法好!"

而後找個地方試試Ctrl-V,驚喜不驚喜,意外不意外?
圖片描述

Ending

至此,咱們已經用python輕鬆愉快的學會了製做一個鬥圖工具了
圖片描述

本章節的全部例子,均可以在個人GitHub上找到:sources of example-1
圖片描述

等等,有BUG!
好吧,目前咱們的小工具可能還存在着一些小小的瑕疵:

  • 文本是左對齊的,如何進行居中呢?
  • 當字數過多的時候,怎麼保證能所有顯示呢?
  • 底圖與表情都只有一款,好單調啊,都鬥不過別人了,咋辦呢?

恩,爲了解決這些問題,咱們——————
圖片描述

相關文章
相關標籤/搜索