Python 2 / Pillow - 计算调整大小的图像高度&宽度

时间:2015-05-02 22:12:24

标签: python django python-imaging-library pillow

我正在使用Django构建一个博客风格的网站,允许人们为他们的帖子上传图片。我写了一些代码来调整用户上传的图像。它采用上传的图像并保存两个副本,1个按比例缩小的大图像和1个缩略图。

代码在我用于开发的个人计算机上完美运行(Python 3,Django 1.8),但它在我的服务器(Python 2,Django 1.8)上的生产中不起作用。在服务器上,显示图像调整大小数学为宽度或高度赋予值0。我尝试了各种舍入等方法,但似乎没有解决问题。

以下是处理图像的views.py部分:

    (card_image_resize, card_image_thumb_resize, card_image_orientation) = image_resize(card_image.userimg.path)
    (w, h) = card_image_resize.size
    card_image_resize.save(card_image.userimg.path)
    card_image_thumb_resize.save(card_image.userimg_thumb.path)
    card_image.orientation = card_image_orientation
    card_image.save()

这是图片大小调整代码:

def image_resize(path):
    image = Image.open(path)

    (w, h) = image.size
    if w > h:
        orientation = 'l'
    elif w < h:
        orientation = 'p'
    else:
        orientation = 's'

#calculate new large image dimensions
    if w >= 1000 or h >= 1000:
        if w > h:
            w_new = 1000
            h_new = (h/w) * 1000
        elif h > w:
            h_new = 1000
            w_new = (w/h) * 1000
        elif h == w:
            h_new = 1000
            w_new = 1000
    else:
        if w > h:
            w_new = 400
            h_new = (h/w) * 400
        elif h > w:
            h_new = 400
            w_new = (w/h) * 400
        elif h == w:
            h_new = 400
            w_new = 400

#calculate thumbnail dimensions
    if w >= 1000 or h >= 1000:
        if w > h:
            wthumb_new = 400
            hthumb_new = (h/w) * 400
        elif h > w:
            hthumb_new = 400
            wthumb_new = (w/h) * 400
        elif h == w:
            hthumb_new = 400
            wthumb_new = 400

    w_new = int(w_new)
    h_new = int(h_new)
    try:
        wthumb_new = int(wthumb_new)
        hthumb_new = int(hthumb_new)
        image_thumb = image.resize((wthumb_new, hthumb_new), Image.ANTIALIAS)
        image = image.resize((w_new, h_new), Image.ANTIALIAS)
    except:
        image_thumb = image.resize((w, h), Image.ANTIALIAS)

    image = image.resize((w_new, h_new), Image.ANTIALIAS)

    return image, image_thumb, orientation

导致问题的部分(我假设)是计算高度或宽度的比率计算的部分:w_new =(w / h)* 1000.当我在开发中运行它时,我得到错误异常值:tile无法扩展到图像外部。查看图像大小值,很明显w_new / h_new计算返回零:

  

card_image_resize:PIL.Image.Image图片模式= RGB 尺寸= 1000x0 at at   0x7FADB1A0E320

保存时出现错误

card_image.save()

我的问题是为什么以及如何解决这个问题?这似乎是一个非常简单的公式来保持图像大小比例。更奇怪的是它适用于Python 3但不适用于Python 2.

我当然不是这方面的专家,所以我愿意采用更有效的方式来调整图像大小。但是,我仍然有兴趣了解为什么该公式返回零值。

1 个答案:

答案 0 :(得分:1)

在Python 3中,/在必要时使用浮点运算。在Python 2中,您必须指定float s。变化:

(w/h) * 400

(float(w)/h) * 400

和类似的,在必要时。