python生成缩略图和合并图片

第一次使用Python Imaging Library,参考了各类文章.
直接贴代码吧,不长.容易理解 以下代码是把一个目录下的图片生成正方形的缩略图,并把缩略图合并成一个大图…

#!/usr/bin/env python
#coding=utf-8
'''
Created on 2012-6-2

@author: fatkun
'''
import Image
import os
import sys
import glob
import time

def make_thumb(path, 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((size, size), Image.ANTIALIAS)
    
    base, ext = os.path.splitext(os.path.basename(path))
    filename = os.path.join(thumb_path, '%s_thumb.jpg' % (base,))
    print filename
    # 保存
    thumb.save(filename, quality=70)
    
def merge_thumb(files, output_file):
    """合并图片"""
    imgs = []
    width = 0
    height = 0
    
    # 计算总宽度和长度
    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]
    
    merge_img.save(output_file, quality=70)

if __name__ == '__main__':
    ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
    IMG_PATH = os.path.join(ROOT_PATH, 'img')
    THUMB_PATH = os.path.join(IMG_PATH, 'thumbs')
    if not os.path.exists(THUMB_PATH):
        os.makedirs(THUMB_PATH)
    
    # 生成缩略图
    files = glob.glob(os.path.join(IMG_PATH, '*.jpg'))
    begin_time = time.clock()
    for file in files:
        make_thumb(file, THUMB_PATH, 90)
    end_time = time.clock()
    print ('make_thumb time:%s' % str(end_time - begin_time))
    
    # 合并图片
    files = glob.glob(os.path.join(THUMB_PATH, '*_thumb.jpg'))
    merge_output = os.path.join(THUMB_PATH, 'thumbs.jpg')
    begin_time = time.clock()
    merge_thumb(files, merge_output)
    end_time = time.clock()
    print ('merge_thumb time:%s' % str(end_time - begin_time))
    

参考文章

API
用 PIL 写了个简单的缩略图生成程序
Python代码:合并图片

updatedupdated2024-08-302024-08-30