当前位置:  开发笔记 > 编程语言 > 正文

如何使用PIL调整图像大小并保持其纵横比?

如何解决《如何使用PIL调整图像大小并保持其纵横比?》经验,为你挑选了9个好方法。

是否有一种显而易见的方法可以解决这个问题?我只是想制作缩略图.



1> gnud..:

定义最大尺寸.然后,通过拍摄来计算调整大小比率min(maxwidth/width, maxheight/height).

适当的大小是oldsize*ratio.

当然还有一种库方法可以做到这一点:方法Image.thumbnail.
以下是PIL文档中的(已编辑)示例.

import os, sys
import Image

size = 128, 128

for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            im = Image.open(infile)
            im.thumbnail(size, Image.ANTIALIAS)
            im.save(outfile, "JPEG")
        except IOError:
            print "cannot create thumbnail for '%s'" % infile


请注意,对于PIL流行的Pillow前叉的用户来说,"ANTIALIAS"不再是首选.http://pillow.readthedocs.org/en/3.0.x/releasenotes/2.7.0.html#default-filter-for-thumbnails
@Eugene:尝试类似`s = img.size(); ratio = MAXWIDTH/s [0]; newimg = img.resize((s [0]*ratio,s [1]*ratio),Image.ANTIALIAS)`?(那是浮点除法:)
Python 3 [PIL文档](http://pillow.readthedocs.io/en/3.1.x/reference/Image.html)表示,只有当结果图像小于原始图像时,"缩略图"才有效.因此,我猜想使用`resize`是更好的方法.
就像它说的那样,这个例子来自pil文档,而那个例子(仍然)不使用antialias标志.因为它可能是大多数人想要的,但我添加了它.
PIL将新图像的高度设置为给定的大小(此处为128)并计算宽度以保持纵横比.有没有办法来修复宽度而不是高度?也许我会在另外的问题中问这个问题.
默认情况下,PIL`save()`方法质量很差,可以使用`image.save(file_path,quality = quality_value)`来改变质量.

2> tomvon..:

此脚本将使用PIL(Python成像库)调整图像(somepic.jpg)的大小,宽度为300像素,高度与新宽度成比例.它通过确定300像素的原始宽度(img.size [0])然后将原始高度(img.size [1])乘以该百分比来实现.将"basewidth"更改为任何其他数字以更改图像的默认宽度.

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('sompic.jpg') 


nit:`resize`没有'PIL.Image.ANTIALIAS`选项,实际应该是`PIL.Image.LANCZOS`,虽然它们的值都是'1`,见http://pillow.readthedocs.io/ EN/3.1.X /参考/ Image.html#PIL.Image.Image.resize
如果您在Zope中使用此脚本作为外部方法,则需要"来自PIL导入图像"这一行,以避免与Zope的"图像"发生命名空间冲突.
感谢`PIL.Image.ANTIALIAS`

3> 小智..:

我还建议使用PIL的缩略图方法,因为它消除了你的所有比例麻烦.

但有一个重要提示:替换

im.thumbnail(size)

im.thumbnail(size,Image.ANTIALIAS)

默认情况下,PIL使用Image.NEAREST过滤器进行大小调整,从而获得良好的性能,但质量很差.



4> muZk..:

总部设在@tomvon,我完成了以下工作:

调整宽度:

new_width  = 680
new_height = new_width * height / width 

调整高度:

new_height = 680
new_width  = new_height * width / height

然后就是:

img = img.resize((new_width, new_height), Image.ANTIALIAS)


你的变量都混淆了.你的帖子说调整宽度,然后调整高度.在`resize`调用中,你使用`new_width`来表示高度和宽度?

5> 小智..:

PIL已经可以选择裁剪图像

img = ImageOps.fit(img, size, Image.ANTIALIAS)


这只是裁剪图像,它不保持纵横比.

6> Mohideen bin..:
from PIL import Image

img = Image.open('/your iamge path/image.jpg') # image extension *.png,*.jpg
new_width  = 200
new_height = 300
img = img.resize((new_width, new_height), Image.ANTIALIAS)
img.save('output image name.png') # format may what u want ,*.png,*jpg,*.gif



7> 小智..:

如果您尝试保持相同的宽高比,那么您不会调整原始大小的某个百分比吗?

例如,原始尺寸的一半

half = 0.5
out = im.resize( [int(half * s) for s in im.size] )


可能是图像具有不同的大小,并且调整大小的结果需要具有统一的大小

8> hoohoo-b..:

如果您不希望/不需要使用枕头打开图像,请使用以下命令:

from PIL import Image

new_img_arr = numpy.array(Image.fromarray(img_arr).resize((new_width, new_height), Image.ANTIALIAS))



9> guettli..:
from PIL import Image
from resizeimage import resizeimage

def resize_file(in_file, out_file, size):
    with open(in_file) as fd:
        image = resizeimage.resize_thumbnail(Image.open(fd), size)
    image.save(out_file)
    image.close()

resize_file('foo.tif', 'foo_small.jpg', (256, 256))

我使用这个库:

pip install python-resize-image

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有