木野狐 (Neil Chen)

用 PIL 写了个简单的缩略图生成程序

最近刚刚学了简单的 PIL (Python Image Library) 的使用方法,感觉比较简单好用!结合最近我要在 web 中做缩略图的需求,写了个函数。这个程序的思路是截取源图中间一块正方形区域,然后做缩放生成缩略图。

啥也不说了,上代码:

#!/usr/bin/env python
#coding=utf-8
import Image
import os

def make_thumb(path, sizes=(75, 32, 16
)):
    
"""
    缩略图生成程序 by Neil Chen
    sizes 参数传递要生成的尺寸,可以生成多种尺寸
    """
   
    
base, ext = os.path.splitext(path
)
    try
:
        im = Image.open(path
)
    except IOError
:
        
return
    mode = im.mode
    if mode not in ('L', 'RGB'
):
        if mode == 'RGBA'
:
            
# 透明图片需要加白色底
            alpha = im.split()[3
]
            bgmask = alpha.point(lambda x: 255-x
)
            im = im.convert('RGB'
)
            
# paste(color, box, mask)
            im.paste((255,255,255), None, bgmask
)
        else
:
            im = im.convert('RGB'
)
            
    
width, height = im.size
    if width == height
:
        region = im
    else
:
        if width > height
:
            delta = (width - height)/
2
            box = (delta, 0, delta+height, height
)
        else
:
            delta = (height - width)/
2
            box = (0, delta, width, delta+width)
           
        
region = im.crop(box
)
            
    
for size in sizes
:
        filename = base + "_" + "%sx%s" % (str(size), str(size)) +
".jpg"
        thumb = region.resize((size,size), Image.ANTIALIAS
)
        thumb.save(filename, quality=100)
# 默认 JPEG 保存质量是 75, 不太清楚。可选值(0~100)

if __name__ == '__main__':
   
    
make_thumb(r"c:/testimg/test.jpg"
)
    make_thumb(r"c:/testimg/test2.jpg"
)
    make_thumb(r"c:/testimg/a.jpg"
)
    make_thumb(r"c:/testimg/DSCF0111.jpg"
)
    make_thumb(r"c:/testimg/test3.jpg")



效果:
test6.JPG

posted on 2007-03-31 20:15 木野狐(Neil Chen) 阅读(2617) 评论(10)  编辑 收藏 网摘 所属分类: Python

评论

#1楼 2007-03-31 20:20 U2U      

不错!   回复  引用  查看    

#2楼[楼主] 2007-03-31 20:24 木野狐      

忘了说了这个是为了做用户上传头像用的,所以固定是正方形的。
  回复  引用  查看    

#3楼 2007-04-01 17:33 亚历山大同志      

不错,比.NET的简单多了   回复  引用  查看    

#4楼[楼主] 2007-04-02 17:05 木野狐      

对 resize 方法,今天增加了一个抗锯齿的选项:
thumb = region.resize((size,size), Image.ANTIALIAS)
  回复  引用  查看    

#5楼[楼主] 2007-04-02 18:53 木野狐      

图片加载后,对于模式不是 RGB 的,需要进行转换。增加了两行代码:

if im.mode not in ('L', 'RGB'):
im = im.convert('RGB')
  回复  引用  查看    

#6楼[楼主] 2007-04-11 17:17 木野狐      

修改了一个问题:PNG 透明背景图片处理后变成了黑底,修改代码如下:

if mode not in ('L', 'RGB'):
if mode == 'RGBA':
# 透明图片需要加白色底
alpha = im.split()[3]
bgmask = alpha.point(lambda x: 255-x)
im = im.convert('RGB')
# paste(color, box, mask)
im.paste((255,255,255), None, bgmask)
else:
im = im.convert('RGB')
  回复  引用  查看    

#7楼 2007-08-20 10:47 lxl[未注册用户]

你好,我想要新建一个图片,然后把新建的图片粘贴到另外的一个图片中,新建的图片中只用imagedraw.text写了几个字(相当于水印效果),但是新建的图片是底色要怎么弄成透明色呢?我现在可以直接在原有的图片上写字,但是我希望实现字是有角度的,即可以看到不是水平的效果,所以想要用新建的方式来实现。请帮忙一下。谢谢。如果能给我发邮件就更好了,e13534@motolora.com   回复  引用    

#8楼[楼主] 2007-08-20 15:50 木野狐(Neil Chen)      

不好意思,这两天我项目忙,加上有一阵没有碰 PIL 了,我过几天有时间了试一下,如果有了解决办法告诉你。   回复  引用  查看    

#9楼[楼主] 2007-08-20 15:50 木野狐(Neil Chen)      

这个邮件试了发不通。   回复  引用  查看    

#10楼 2009-01-31 23:40 alva[未注册用户]

楼主,我也想知道7楼的问题怎么解决,可以的话能不能发份邮件给我呢?谢谢了!   回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 695351




相关文章:

相关链接: