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 中,您必须指定 float
s。变化:
(w/h) * 400
到
(float(w)/h) * 400
和类似的,如有必要。
我正在使用 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 中,您必须指定 float
s。变化:
(w/h) * 400
到
(float(w)/h) * 400
和类似的,如有必要。