??【Python入門到精通】(二十七)更進一步的了解Pillow吧!

      網(wǎng)友投稿 954 2025-04-01

      您好,我是碼農(nóng)飛哥,感謝您閱讀本文,歡迎一鍵三連哦。

      進一步介紹Pillow庫的使用,詳細了解

      干貨滿滿,建議,需要用到時常看看。 小伙伴們?nèi)缬袉栴}及需要,歡迎踴躍留言哦~ ~ ~。

      前言

      Image模塊

      讀取網(wǎng)頁中的圖片

      圖片裁剪

      圖片模式的說明:

      ImageDraw模塊

      畫圖的方法介紹

      畫正方形

      畫弧形

      畫圓

      畫半圓

      畫扇形

      畫矩形

      畫圓角矩形

      解決一個問題

      ImageEnhance模塊

      ImageFilter模塊

      ImageGrab模塊

      利用Pillow庫對圖像增加水印

      總結(jié)

      參考

      源碼獲取

      前言

      本文是接上一篇??【Python從入門到精通】(二十六)用Python的PIL庫(Pillow)處理圖像真的得心應手?? 進一步介紹Pillow庫的使用,本文將重點介紹一些高級特性:比如如何利用Pillow畫圖形(圓形,正方形),介紹通過Pillow庫給圖片添加水印;同時對上一篇文章未介紹的常用知識點進行補充說明。希望對讀者朋友們有所幫助。

      Image模塊

      上一篇文章已經(jīng)介紹了Image模塊,但是介紹的還不夠全面,例如如何從網(wǎng)頁中讀取圖片沒有介紹到,如何裁剪圖片都沒有介紹到。

      讀取網(wǎng)頁中的圖片

      讀取網(wǎng)頁中的圖片的基本實現(xiàn)方式是:首先利用requests庫讀取當前圖片鏈接的內(nèi)容,接著將內(nèi)容轉(zhuǎn)成二進制數(shù)據(jù),在通過open方法將該二進制數(shù)據(jù),最后通過save方法進行保存。

      from PIL import Image from io import BytesIO import requests # 讀取網(wǎng)頁圖片 res = requests.get( 'https://img-blog.csdnimg.cn/f2e98e08d5ec4283b08972c5ee8e1689.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA56CB5Yac6aOe5ZOl,size_20,color_FFFFFF,t_70,g_se,x_16').content #將圖片內(nèi)容轉(zhuǎn)成二進制 im2 = Image.open(BytesIO(res)) b = BytesIO() im2.save(b, format='PNG') im2.show()

      讀取結(jié)果是:

      圖片裁剪

      通過crop方法可以從圖片中裁剪出一個指定大小的區(qū)域。裁取的區(qū)域范圍是(left, upper, right, lower) 比如從某個寬高都是400的圖片中裁剪一個是寬高都是100的正方形區(qū)域,只需要指定裁剪區(qū)域的坐標是: (0, 0, 100, 100)

      im2 = Image.new('RGBA', (400, 400), 'blue') box = (0, 0, 100, 100) region = im2.crop(box) # 設(shè)置要裁剪的區(qū)域 region.show()

      有裁剪還有一個方法就是重新設(shè)置圖片大小的方法 resize,比如將前面400400的圖片 修改成 300200,只需要調(diào)用resize方法

      img4 = im2.resize((300, 200)) img4.show()

      圖片模式的說明:

      通過 convert方法進行圖片模式的轉(zhuǎn)換

      ImageDraw模塊

      前面介紹的ImageDraw庫,只是介紹了利用它來向圖片寫入文本,其實ImageDraw模塊還有一個更有用的途徑,就是可以通過它來畫各種圖形。

      畫圖的方法介紹

      畫正方形

      首先創(chuàng)建一個600*600的畫布。然后再畫布中畫出一個正方形,畫直線的方法是 line方法。

      ImageDraw.line(xy, fill=None, width=0, joint=None)

      在xy的坐標之間畫一條直線

      xy–> 在兩個坐標點之間畫一條直線,坐標點的傳入方式是[(x, y), (x, y), …]或者[x, y, x, y, …]

      fill–> 直線的顏色

      width–> 直線的寬度

      # 畫點 im = Image.new('RGB', (600, 600), 'white') draw = ImageDraw.Draw(im) # # 創(chuàng)建一個正方形,fill 代表的為顏色 draw.line([100, 100, 100, 500], fill='blue', width=2) # 左豎線 draw.line([100, 100, 500, 100], fill='blue', width=2) # 上橫線 draw.line([500, 100, 500, 500], 'blue', width=2) #右豎線 draw.line([100, 500, 500, 500], 'blue', width=2) #下橫線 im.save('picture/sequare.png', 'png') im.show()

      畫一個邊框?qū)挾葹?px,顏色為藍色的,面積為400*400的正方形。

      畫弧形

      ImageDraw.arc(xy, start, end, fill=None, width=0)

      在給定的區(qū)域范圍內(nèi),從開始角到結(jié)束角之間繪制一條圓弧

      xy–> 定義邊界框的兩個點,傳入的格式是[(x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0

      start --> 起始角度,以度為單位,從3點鐘開始順時針增加

      ??【Python從入門到精通】(二十七)更進一步的了解Pillow吧!

      end–> 結(jié)束角度,以度為單位

      fill–> 弧線的顏色

      width–>弧線的寬度

      draw.arc([100, 100, 600, 600], 0, 180, fill='black') im.show()

      這里就是畫了一個半圓,如果結(jié)束角度是360度的話則就會畫一個完整的圓。

      畫圓

      畫圓通過ImageDraw.ellipse(xy, fill=None, outline=None, width=1) 方法,該方法可以畫出一個給定范圍的圓

      xy–> 定義邊界框的兩個點,傳入的格式是[(x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0

      outline–> 輪廓的顏色

      fill —> 填充顏色

      width–> 輪廓的寬度

      draw.ellipse([100, 100, 600, 600], outline='black', fill='blue') im.show()

      畫半圓

      ImageDraw.chord(xy, start, end, fill=None, outline=None, width=1) 方法用來畫半圓,跟arc()方法不同的是它會用直線將起始點和結(jié)束點連接起來

      xy–> 定義邊界框的兩個點,傳入的格式是[(x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0

      outline–> 輪廓的顏色

      fill —> 填充顏色

      width–> 輪廓的寬度

      draw.chord([100, 100, 600, 600], 0, 180, outline='black', fill='red') im.show()

      畫扇形

      ImageDraw.pieslice(xy, start, end, fill=None, outline=None, width=1)

      類似于arc()方法,不過他會在端點和圓點之間畫直線

      xy–> 定義邊界框的兩個點,傳入的格式是[(x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0

      start --> 起始角度,以度為單位,從3點鐘開始順時針增加

      end–> 結(jié)束角度,以度為單位

      fill–> 弧線的顏色

      width–>弧線的寬度

      draw.pieslice([100, 100, 600, 600], 180, 300, outline='red', fill='blue') im.show()

      畫矩形

      ImageDraw.rectangle(xy, fill=None, outline=None, width=1)

      xy–> 在兩個坐標點之間畫一條直線,坐標點的傳入方式是[(x, y), (x, y), …]或者[x, y, x, y, …]

      outline–> 輪廓的顏色

      fill–> 填充的顏色

      width–> 輪廓線的寬度

      # 矩形 draw.rectangle((100, 200, 300, 500), outline='red', fill='blue') im.show()

      畫圓角矩形

      ImageDraw.rounded_rectangle(xy, radius=0, fill=None, outline=None, width=1) 該方法可以畫一個圓角矩形

      xy–> 在兩個坐標點之間畫一條直線,坐標點的傳入方式是[(x, y), (x, y), …]或者[x, y, x, y, …]

      radius–> 角的半徑

      outline–> 輪廓的顏色

      fill–> 填充的顏色

      width–> 輪廓線的寬度

      draw.rounded_rectangle((200, 200, 600, 600), radius=2, outline='green') im.show()

      解決一個問題

      這里有個問題,就是畫好的圖形如何從Image中扣出來呢?

      ImageEnhance模塊

      ImageEnhance模塊主要是用于設(shè)置圖片的顏色對比度亮度銳度等啥的,增強圖像。

      原圖

      from PIL import ImageEnhance, Image org_img = Image.open('picture/img10.png') org_img.show(title='原圖')

      原始圖像

      圖像的顏色平衡,顏色增強1.2倍

      PIL.ImageEnhance.Color(image) 方法,這個方法主要用于調(diào)整圖像的色彩平衡,原始圖像的系數(shù)是1.0,0.0的增強系數(shù)得到的是一個黑白圖像

      cl = ImageEnhance.Color(org_img) #黑白圖像 ce = cl.enhance(0) ce.show() #增強1.2倍 ce1 = cl.enhance(1.2) ce1.show()

      調(diào)整圖像的對比度 3:4

      PIL.ImageEnhance.Contrast(image)該方法主要用于調(diào)整圖像的對比度,類似于電視機上的對比度控制,0.0的增強系數(shù)給出的是一個純灰色圖像,系數(shù)1.0則得到原始圖像

      ct = ImageEnhance.Contrast(org_img) ch = ct.enhance(0) ch.show(title='對比度0純灰色') ch1 = ct.enhance(3.4) ch1.show(title='對比度3.4')

      7. 調(diào)整圖像的亮度

      PIL.ImageEnhance.Brightness(image) ,該方法主要用于調(diào)整圖像的亮度,0.0的增強系數(shù)表示黑色圖像。系數(shù)為1.0則得到原始圖像。

      br = ImageEnhance.Brightness(org_img) be = br.enhance(0) be.show(title='亮度0') be = br.enhance(3) be.show(title='亮度3')

      調(diào)整圖像的銳度

      PIL.ImageEnhance.Sharpness(image) ,該方法主要用于調(diào)整圖像的銳度,0.0的增強因子為模糊圖像,1.0的增強因子為原始圖像,2.0的增強因子為銳化圖像。

      sp = ImageEnhance.Sharpness(org_img) se = sp.enhance(0) se.show(title='銳度0') se1 = sp.enhance(20) se1.show(title='銳度20')

      ImageFilter模塊

      ImageFilter模塊主要用于對圖像進行過濾,增強邊緣,模糊處理,該模塊的使用方式是im.filter(ImageFilter) 。

      其中ImageFilter按照需求傳入指定的過濾值。

      下面一個個試下效果

      原圖

      from PIL import Image, ImageFilter im = Image.open('picture/img10.png') im.show()

      2. 高斯模糊

      im1 = im.filter(ImageFilter.GaussianBlur) im1.show()

      3. 普通模糊

      im2 = im.filter(ImageFilter.BLUR) im2.show()

      4.邊緣增強

      im3 = im.filter(ImageFilter.EDGE_ENHANCE) im3.show()

      5. 找到邊緣

      im4 = im.filter(ImageFilter.FIND_EDGES) im4.show()

      6. 浮雕

      im5 = im.filter(ImageFilter.EMBOSS) im5.show()

      7. 輪廓

      im6 = im.filter(ImageFilter.CONTOUR) im6.show()

      8. 銳化

      im7 = im.filter(ImageFilter.SHARPEN) im7.show()

      ImageGrab模塊

      ImageGrab模塊主要用于對屏幕進行截圖,通過grab方法進行截取,如果不傳入任何參數(shù)則表示全屏幕截圖,否則是截取指定區(qū)域的圖像。其中box格式是:(x1,x2,y1,y2)

      from PIL import ImageGrab im1 = ImageGrab.grab((0, 0, 600, 300)) # 截取屏幕600*300的區(qū)域的圖像 im2 = ImageGrab.grab() # 不帶參數(shù)表示全屏幕截圖 im1.show() im2.show()

      利用Pillow庫對圖像增加水印

      利用Pillow庫可以輕易的對圖像增加水印

      首先,用PIL的Image函數(shù)讀取圖片

      接著,新建一張圖(尺寸和原圖一樣)

      然后,在新建的圖象上用PIL的ImageDraw把字給畫上去,字的顏色從原圖處獲取。

      from PIL import Image, ImageDraw, ImageFont font_size = 8 text = "泳池美女" img_raw = Image.open("../picture/beautiful.jpeg") # 1.讀取圖像,獲取每一個像素值 img_array = img_raw.load() # 2. 新建畫布,選好要使用的字體大小 new_img = Image.new('RGB', img_raw.size, 'gray') font = ImageFont.truetype("../picture/simsun.ttf", size=font_size) draw = ImageDraw.Draw(new_img) # 搞一個生成器(不斷循環(huán)"泳池美女") def character_generate(text): while True: for i in range(len(text)): yield text[i] char_gen = character_generate(text) # 實現(xiàn)效果 for y in range(0, img_raw.size[1], font_size): for x in range(0, img_raw.size[0], font_size): draw.text((x + 1, y + 1), next(char_gen), font=font, fill=img_array[x, y]) new_img.convert('RGB').save("../picture/beautiful_result.jpeg")

      原圖

      添加文字后的效果圖

      總結(jié)

      本文詳細介紹了Pillow庫的使用,希望對讀者朋友們有所幫助。

      參考

      Pillow官方文檔

      源碼獲取

      需要獲取源碼的小伙伴可以關(guān)注下方的公眾號,回復【python】

      我是碼農(nóng)飛哥,再次感謝您讀完本文。

      Image Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:你會玩這個把戲嗎?巧用Word將Excel多列數(shù)據(jù)合并成一列
      下一篇:倉庫庫存管理的進銷存表格
      相關(guān)文章
      亚洲综合婷婷久久| 国产亚洲色婷婷久久99精品| 亚洲Av综合色区无码专区桃色| 亚洲国产精品日韩专区AV| 亚洲AV网一区二区三区| 亚洲中文字幕无码mv| 亚洲日韩AV一区二区三区四区| 亚洲三级高清免费| 亚洲国产激情在线一区| 亚洲乱码一区二区三区国产精品| 亚洲国产精品线观看不卡| 亚洲人成电影在线观看网| 亚洲男人的天堂久久精品| 日本亚洲精品色婷婷在线影院| 亚洲乱码无限2021芒果| 亚洲一卡2卡3卡4卡乱码 在线| 亚洲国产日韩视频观看| 亚洲欧美国产国产一区二区三区| 亚洲精品成a人在线观看☆| 亚洲av无码专区青青草原| 亚洲AV日韩AV无码污污网站| 精品国产亚洲一区二区三区在线观看| 亚洲国产av玩弄放荡人妇 | 亚洲精品无码一区二区| 亚洲国产av玩弄放荡人妇| 亚洲av无码国产精品色在线看不卡 | 亚洲avav天堂av在线不卡| 色噜噜综合亚洲av中文无码| 亚洲色图黄色小说| 亚洲fuli在线观看| 亚洲av无码专区在线电影天堂| 亚洲国产成人久久综合一区77| 久久影视综合亚洲| 国产亚洲AV无码AV男人的天堂| 亚洲欧洲国产精品你懂的| 亚洲另类春色校园小说| 亚洲中文字幕无码av| www.亚洲色图| 亚洲精品亚洲人成人网| 青青草原精品国产亚洲av| 国产成+人+综合+亚洲专|