我正在使用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.
我当然不是这方面的专家,所以我愿意采用更有效的方式来调整图像大小。但是,我仍然有兴趣了解为什么该公式返回零值。
答案 0 :(得分:1)
在Python 3中,/
在必要时使用浮点运算。在Python 2中,您必须指定float
s。变化:
(w/h) * 400
到
(float(w)/h) * 400
和类似的,在必要时。