浏览 8491 次
锁定老帖子 主题:利用PIL剪切出正方形图片
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-23
最后修改:2011-01-24
PIL图形库很多有用的函数,做网站用的比较多的要数剪切图片了,平时都是用thumbnail函数来完成,它能满足我的大部分需求,但也有时并不是我们需要的,比如一张1024*768像素的大图,你想剪切成为300*300像素的小图,这时你用thumbnail剪切出来的小图宽度是300像素了,但小图的高度也跟着等比例缩小,变成了225像素。
有没有相关的函数,可以满足我们的需求呢?有,那就是transform函数,transform函数可以传入剪切图片的尺寸size(宽高),一个方法method(EXTENT)和剪切区域data的起始点和结束点,返回的是image。完整的定义如:
im.transform(size, method, data) => image
有了这个函数,我们就可以考虑我们刚才的需求了。关键很是剪切的区域。
思路大致为:
选择剪切区域之前,我们就考虑,一个长方形的图片,剪切成正方形,肯定要舍些东西,把多余的部分去掉。既然图片宽度比高度大,我们就把图片左右两边剪切点,剩下来的这就是我们的选择区域了。接下来就开始求多余的部分的数值了。
首先先比较图片的 宽度和高度,比如图片是img,img.size我们就得到它的宽w和高h了。
w=img.size[0] h=img.size[1],img宽度比高度多出了w-h个像素。那么方案自然就出来了,从大图的左边开始,垂直剪切(w-h)/2个像素,再从右开始垂直剪切(w-h)/2个像素便得出一个768像素的正方形小图来了。再用thumbnail剪切成需要的尺寸300,OK完成了。
代码如下:
import Image from Image import EXTENT if img.size[0]>img.size[1]: offset=int(img.size[0]-img.size[1])/2 img=img.transform((img.size[1],img.size[1]),EXTENT,(offset,0,int(img.size[0]-offset),img.size[1])) else: offset=int(img.size[1]-img.size[0])/2 img=img.transform((img.size[0],img.size[0]),EXTENT,(0,offset,img.size[0],(img.size[1]-offset))) img.thumbnail((300, 300))这篇随笔 是《Django&JQuery手动剪切个性头像》的后续.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-26
裁剪图片用crop方法似乎更方便一些?
img2 = img.crop(x1, y1, x2, y2) |
|
返回顶楼 | |
发表时间:2010-03-27
oldJ 写道 裁剪图片用crop方法似乎更方便一些? img2 = img.crop(x1, y1, x2, y2) 这个函数来得更简便一些。最初的想法是想找一个函数,直接指定图片的宽度和高度,等比例剪切的,结果没有找到,只能使用计算的土办法,再随手使用了transform函数,有了crop以后,就不用传入 宽度和高度了,感觉他们有点多余了。 不知道有没有我上面说的函数。指定宽高,直接等比例剪切(不留黑边的)。 |
|
返回顶楼 | |
发表时间:2010-04-13
PIL能不能剪切出圆形图片?
|
|
返回顶楼 | |