Python 2 / Pillow - 计算调整后的图像高度和宽度时出现问题

Python 2 / Pillow - issue calculating resized image height & width

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

该代码在我用于开发的个人计算机上运行良好(Python 3,Django 1.8),但它在我的服务器上的生产环境中不起作用(Python 2,姜戈 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 cannot extend outside image。查看图像大小值,很明显 w_new / h_new 计算返回零:

card_image_resize: PIL.Image.Image image mode=RGB size=1000x0 at 0x7FADB1A0E320

保存时出错

card_image.save()

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

诚然,我不是这方面的专家,所以我愿意接受一种更有效的调整图像大小的方法。但是,我仍然有兴趣了解为什么该公式 returns 的值为零。

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

(w/h) * 400

(float(w)/h) * 400

和类似的,如有必要。