show-me-the-code:圖片處理

第 0000 題:將你的 QQ 頭像(或者微博頭像)右上角加上紅色的數字,相似於微信未讀信息數量那種提示效果。 相似於圖中效果python

第 0001 題:作爲 Apple Store App 獨立開發者,你要搞限時促銷,爲你的應用生成激活碼(或者優惠券),使用 Python 如何生成 200 個激活碼(或者優惠券)?git

第 0005 題:你有一個目錄,裝了不少照片,把它們的尺寸都變成不大於 iPhone5 分辨率的大小github

第 0010 題:使用 Python 生成相似於下圖中的字母驗證碼圖片;bash

第 0022 題:iPhone 六、iPhone 6 Plus 早已上市開賣,請查看你寫的 第 0005 題的代碼是否能夠複用;微信

 

Pillow

    The friendly PIL fork (Python Imaging Library)dom

    PIL:Python Imaging Library,顧名思義,這是 Python 平臺上的圖像處理標準庫,功能很是強大,API 很是簡單易用,可是因爲許久未維護了,對 Python 3 不支持,因此選用 Pillow(在 PIL 基礎上建立的兼容版本),支持最新的 Python 3.x,又加入了許多新特性。ide

安裝 Pillow

$ pip3 install pillow

簡單操做圖片

# -*- coding: utf-8 -*-

from PIL improt Image

imagefile = './111.png'

# 打開一個圖片
image = Image.open(imagefile)

print(image.show())

 

Image 類

    Pillow 庫中最核心的類就是 Image 了,讀取圖片、處理圖片、建立圖片等操做都須要 Image 的支持;函數

# -*- coding: utf-8 -*-

from PIL import Image

# 打開一個圖片,並返回 Image 對象
image = Image.open("111.jpg")

# 查看圖片各項屬性
print(image.format, image.size, image.mode)

    Pillow 庫支持很是多的圖片格式,使用 open() 函數直接讀取圖片便可,不須要考慮圖片的格式,Pillow 本身會處理。學習

    Image 模塊中 save() 函數能夠保存圖片,除非自定義文件格式,那麼文件中擴展名用來指定文件格式:ui

from PIL import Image

image = Image.open('111.jpg')
# Image 模塊中 save() 函數保存圖片
image.save('222.png')
# 保存爲指定格式
image.save('222', 'jpeg')

    Pillow 不會解碼或 raster 數據,當你打開一個文件,Pillow 經過文件頭確認文件格式,大小,mode 等數據,餘下數據直到須要時才處理,這就意味着 Pillow 在打開文件時很是快,與文件大小和壓縮格式無關;

裁剪、粘貼、合併圖片

from PIL import Image

image = Image.open('111.jpg')

# 從圖片中提取一個子矩形 (left, upper, right, lower), Pillow 左邊系統的原點(0,0)爲圖片的左上角,座標中的數字
# 單位爲像素點,下面爲截取圖片大小爲 300*300 像素
box = (100, 100, 400, 400)
region = image.crop(box)

# Rolling an image
def roll(image, delta):
    "Roll an image sideways"

    xsize, ysize = image.size

    delta = delta % xsize
    if delta == 0: return image

    part1 = image.crop((0, 0, delta, ysize))
    part2 = image.crop((delta, 0, xsize, ysize))
    part1.load()
    part2.load()
    image.paste(part2, (0, 0, xsize-delta, ysize))
    image.paste(part1, (xsize-delta, 0, xsize, ysize))

    return image

# Splitting and merging bands
r, g, b = im.split()
im = Image.merge("RGB", (b, g, r))

操做圖像

# -*- coding: utf-8 -*-
from PIL import Image, ImageFilter

# 打開一個jpg圖像文件,注意是當前路徑:
im = Image.open('test.jpg')
# 得到圖像尺寸:
w, h = im.size
print('Original image size: %sx%s' % (w, h))
# 縮放到50%:
im.thumbnail((w//2, h//2))
print('Resize image to: %sx%s' % (w//2, h//2))
# 把縮放後的圖像用jpeg格式保存:
im.save('thumbnail.jpg', 'jpeg')

# 開啓模糊濾鏡
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg', 'jpeg')

ImageDraw

    PIL 的 ImageDraw 提供了一系列繪圖方法,能夠直接繪圖,生成驗證碼圖片等:

    第 0010 題中圖片就是使用 ImageDraw 生成的。

 

其餘更多功能能夠參考 Pillow 官網文檔:https://pillow.readthedocs.org/random

 

random

    random 模塊主要用於生成隨機數

random.uniform

    random.uniform(a, b) ,用於生成一個指定範圍(a,b)內的隨機浮點數

bpython version 0.16 on top of Python 3.5.1 /usr/local/opt/python3/bin/python3.5
>>> import random
>>> random.uniform(1, 10)
8.273246268076129
>>>

 

random.randint

    random.randint(a, b),用於生成一個指定範圍內的整數:

>>> random.randint(64, 255)
119
>>>

 

random.randrange

    random.randrange([start], stop[, step]),從指定範圍內,按指定基數遞增的集合中獲取一個隨機數:

# random.randrange(10, 100, 2) 至關於從 [10, 12, 14... 96, 98] 序列中獲取一個隨機數
# 至關於 random.choice(range(10, 100, 2))
>>> random.randrange(10, 100, 2)
68
>>>

 

random.choice

    random.choice(sequence),從序列中獲取一個隨機元素,sequence 泛指一系列類型:list、tuple,str 等都屬於 sequence:

>>> random.choice(["JGood", "is", "a"])
'JGood'
>>> random.choice("學習 python")
'n'
>>> random.choice(("JGood", "is", "a"))
'is'
>>>

 

random.shuffle

    random.shuffle(x [, random]),用於將一個列表中的元素打亂,如同洗牌;

>>> p=["Python","is","powerful","simple","andsoon..."]
>>> random.shuffle(p)
>>> print(p)
['Python', 'andsoon...', 'simple', 'is', 'powerful']
>>>

 

random.sample

    random.sample(sequence, k),從指定序列中隨機獲取指定長度的片斷,sample 不會修改原有序列:

>>> list=[1,2,3,4,5,6,7,8,9,10]
>>> slice=random.sample(list,5) # 從 list 中隨機獲取 5 個元素,做爲一個片斷返回
>>> print(slice)
[7, 4, 5, 10, 1]
>>> blice=random.sample(list)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    blice=random.sample(list)
TypeError: sample() missing 1 required positional argument: 'k'
>>> blice=random.sample(list, k=1)
>>> print(blice)
[9]
>>>

 

題目代碼上傳至 github 上

相關文章
相關標籤/搜索