當前位置:
首頁 > 科技 > 這才是 Python的「72 變」玩法!

這才是 Python的「72 變」玩法!

作者 | 阿廣

責編 | 胡巍巍

基於Python的鉛筆素描圖

說到鉛筆素描,很多畫家用它用得極為精湛。

有的細緻到跟照片無法區別,簡直是墨筆丹青,如行雲流水繞素箋,展瀚海崇山依舊顏,怎一個好字了得;但是有的人畫素描怎麼花都畫不好。

那麼同一根鉛筆,為啥差距這麼大呢?今天筆者給大家介紹一種使用PIL庫對原畫自動生成素描畫。


思考

鉛筆素描的細節實體如何和Python灰度化、模糊度進行轉換?

模糊度和參數如何調節?


彩色圖像和鉛筆素描對比

筆者丑照圖

筆者丑照鉛筆素描圖

山東科技大學校訓彩色圖

山東科技大學校訓鉛筆素描圖

濟南校區一角風景原圖

濟南校區一角風景鉛筆素描圖

山科一角美景圖

山科一角鉛筆素描圖


爬蟲技術分析

PIL庫:

PIL(Python Image Library)是Python的第三方圖像處理庫,但是由於其強大的功能與眾多的使用人數,幾乎已經被認為是Python官方圖像處理庫了。其官方主頁為:PIL。

PIL歷史悠久,原來是只支持Python2.x的版本的,後來出現了移植到Python3的庫Pillow,Pillow號稱是friendly fork for PIL,其功能和PIL差不多,但是支持Python3。


代碼解析

導入PIL庫

fromPILimportImage, ImageFilter, ImageOps

載入圖片

#先到相應的路徑下載入到這張圖片

img= Image.open("zandaoguang.jpg") #jpg和png格式均可

處理圖片並展示圖片

defFormula(a, b, alpha):

returnmin(int(a*255/(256-b*alpha)),255)

#通過雙層for循環將圖片轉換

defzandaoguang(img, blur=25, alpha=1.0):

img1 = img.convert("L")#圖片轉換成灰色

img2 = img1.copy()

img2 = ImageOps.invert(img2)

foriinrange(blur):#模糊度

img2 = img2.filter(ImageFilter.BLUR)

width, height = img1.size

forxinrange(width):

foryinrange(height):

a = img1.getpixel((x, y))

b = img2.getpixel((x, y))

img1.putpixel((x, y), Formula(a, b, alpha))

img1.show()#展示圖片效果

zandaoguang(img)


由於篇幅原因,這就只展示部分代碼,詳情請查看源碼請自行去GitHub下載:

https://github.com/zandaoguang/pic_proc


後記

畢加索曾經說過:「我在十幾歲時畫畫就像個古代大師,但我花了一輩子學習怎樣像孩子那樣畫畫。」

最後筆者想對大家說:畫畫,我是認真的;搞笑,絕對不是故意的。

如何利用Python打飛機?

學過爬蟲的朋友都知道,它是一門「以簡制勝」的語言,在筆者兩天的努力下,使用200行代碼完成了「打飛機」小遊戲。

我相信雷霆戰機很多人都玩過吧,它是Pygame庫開發出來的。同時,它還可以開發掃雷、坦克大戰等很多有趣的遊戲!

遊戲界面

遊戲說明

這是一個簡易的Python遊戲代碼,很多細節都沒有去做;

大家克隆下來可以直接運行showEnemy.py即可;

和ASDF控制方向,空格鍵發射子彈;

Random函數主要實現敵方飛機產生和子彈的發射頻率;

time.sleep()為了讓CPU休息;

後期我們完善的時候可以加上擊中等場景的特效。

部分代碼

初始化飛機參數

def__init__(self,screen):

#設置飛機默認的xy值

self.x=180

self.y=600

self.screen=screen

self.imageName="./feiji/hero.gif"

self.image=pygame.image.load(self.imageName).convert()

self.bulletList=[]

self.needRemoveList=[]

顯示飛機

defdisplay(self):

self.screen.blit(self.image,(self.x,self.y))

forbulletinself.bulletList:

bullet.display()

bullet.move()

forbulletinself.bulletList:

ifbullet.judgeOut():

self.needRemoveList.append(bullet)

forbulletinself.bulletList:

ifbulletinself.needRemoveList:

self.bulletList.remove(bullet)

飛機移動

defmove(self,opt):

ifopt=="left":

self.x-=15

elif opt=="right":

self.x+=15

elif opt=="up":

self.y-=15

elif opt=="down":

self.y+=15

飛機射擊

defshoot(self):

newBullet=Bullet(self.screen,self.x,self.y)

newBulletLeft=BulletSmall(self.screen,self.x,self.y)

newBulletRight=BulletSmall(self.screen,self.x+64,self.y+20)

self.bulletList.append(newBulletLeft)

self.bulletList.append(newBulletRight)

self.bulletList.append(newBullet)

Python版雷霆戰機完整代碼鏈接:

https://github.com/zandaoguang/play-plane

之前玩雷霆戰機的時候,看起來打飛機遊戲蠻複雜,結果經過自己的實現之後,發現僅僅200行就能完成一個打飛機的小項目。

敲黑板,我們在做任何一件事情得時候,一定不要眼高手低,也不要大題小作。

只要是認真做就可以超越昨天的自己。像這款遊戲一樣,我們的人生只有一關一關的擊敗敵機(困難),只有在擊敗了敵機的情況下(完成了艱難任務),我們才能獲得新的裝備(知識),不斷攀升,最終經過不斷提升自己,走向成功!下面是啊廣總結,與大家共勉!

眼高手低志不廣,

欺軟怕硬人囂張;

欲上天宮攬明月,

以為自己會飛翔!

作者簡介:阿廣。本文首發個人公眾號視學演算法,專註於大數據、人工智慧和演算法的學習平台,也是一名保送中科院軟體研究所直博的技術提升之路。人生苦短,我願做您最忠實的技術支持夥伴!一起用代碼改變世界!

聲明:本文為作者投稿,版權歸其個人所有。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

鎚子終究走起了小米的路子
如何高效排查日均調度量超兩百萬次的重複調度問題?

TAG:CSDN |