python接收圖片變成縮略圖

python圖像處理庫:Pillow初級教程

Image類

 

Image.resize()和Image.thumbnail()的區別 
根據代碼和代碼註釋, 這兩個函數都是對圖片進行縮放, 二者的主要區別以下:python

  • resize()函數會返回一個Image對象, thumbnail()函數返回None
  • resize()修改後的圖片在返回的Image中, 而原圖片沒有被修改;
  • thumbnail()直接對內存中的原圖進行了修改, 可是修改須要保存
  • resize()中的size參數直接設定了resize以後圖片的規格,而thumbnail()中的size參數則是設定了x/y上的最大值. 也就是說, 通過resize()處理的圖片可能會被拉伸,而通過thumbnail()處理的圖片不會被拉伸

thumbnail()函數內部調用了resize(), 能夠認爲thumbnail()是對resize()的一種封裝 app

 

Pillow中最重要的類就是Image,該類存在於同名的模塊中。能夠經過如下幾種方式實例化:從文件中讀取圖片,處理其餘圖片獲得,或者直接建立一個圖片。函數

使用Image模塊中的open函數打開一張圖片:tornado

>>> from PIL import Image
>>> im = Image.open("lena.ppm")

若是打開成功,返回一個Image對象,能夠經過對象屬性檢查文件內容測試

>>> from __future__ import print_function
>>> print(im.format, im.size, im.mode)
PPM (512, 512) RGB

format屬性定義了圖像的格式,若是圖像不是從文件打開的,那麼該屬性值爲None;size屬性是一個tuple,表示圖像的寬和高(單位爲像素);mode屬性爲表示圖像的模式,經常使用的模式爲:L爲灰度圖,RGB爲真彩色,CMYK爲pre-press圖像。spa

若是文件不能打開,則拋出IOError異常。.net

當有一個Image對象時,能夠用Image類的各個方法進行處理和操做圖像,例如顯示圖片:code

>>> im.show()

建立縮略圖 --> 經常使用方式, 但有限制, 看源碼解釋

若是有寬或長大於了, 測試出來的結果感受有點像成比例似的orm

x, y = self.size
if x > size[0]:
  y = int(max(y * size[0] / x, 1))
  x = int(size[0])
if y > size[1]:
  x = int(max(x * size[1] / y, 1))
  y = int(size[1])
size = x, y對象

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-

# -----<縮略圖>----- #

import os, datetime
from PIL import Image


def ThumbNailImg(infile):
    # 略縮圖路徑
    outfile = os.path.splitext(infile)[0] + "_ThumbNail" + ".jpeg"
    im = Image.open(infile)
    size = (206, 206)
    im.thumbnail(size, Image.ANTIALIAS)
    im.save(outfile)
    return outfile

 

 精確指定圖片寬、高

def make_thumb(path, size):
    """生成縮略圖"""
    img = Image.open(path)
    width, height = img.size
    # 裁剪圖片成正方形
    if width > height:
        delta = (width - height) / 2
        box = (delta, 0, width - delta, height)
        region = img.crop(box)
    elif height > width:
        delta = (height - width) / 2
        box = (0, delta, width, height - delta)
        region = img.crop(box)
    else:
        region = img

        # 縮放
    thumb = region.resize((900, 500), Image.ANTIALIAS)

    filename = os.path.splitext(path)[0] + "_ThumbNail" + ".gif"
    print(filename)
    # 保存
    thumb.save(filename, quality=70)

 

上下拼接圖片

參考連接: https://blog.csdn.net/jiaju_cao/article/details/16958185 

def merge_thumb(files, output_file):
    """上下合併圖片"""
    imgs = []
    width = 0
    height = 0

    # 計算總寬度和長度
    print(files)
    for file in files:
        img = Image.open(file)
        if img.mode != 'RGB':
            img = img.convert('RGB')
        imgs.append(img)
        if img.size[0] > width:
            width = img.size[0]
        height += img.size[1]

        # 新建一個白色底的圖片
    merge_img = Image.new('RGB', (width, height), 0xffffff)
    cur_height = 0
    for img in imgs:
        # 把圖片粘貼上去
        merge_img.paste(img, (0, cur_height))
        cur_height += img.size[1]
    print(output_file)

    merge_img.save(output_file, quality=70)



if __name__ == '__main__':

    # 上下合併圖片
    THUMB_PATH = "/opt/code/my_code/tornado_uedit"
    # ['/opt/code/my_code/tornado_uedit/143351404554_ThumbNail.gif', '/opt/code/my_code/tornado_uedit/171047953516_ThumbNail.gif']
    files = glob.glob(os.path.join(THUMB_PATH, '*_ThumbNail.gif'))
    merge_output = os.path.join(THUMB_PATH, 'thumbs.gif')
    merge_thumb(files, merge_output)

 glob模塊,glob.glob(pathname),返回全部匹配的文件路徑列表

相關文章
相關標籤/搜索