有一种简单的方法吗? 在Python中,我创建了一个脚本,用于从图像中获取“方框”...基于中心。
然而,这杀死了我的一些脑细胞。有没有一种简单的方法来实现3x2(3宽,2高),基于中心?
这是我的“方框”脚本,但我不想为3x2修改它。
def letterbox(f,thumb_w=None,thumb_h=None):
try:
im = Image.open(StringIO(f))
imagex = int(im.size[0])
imagey = int(im.size[1])
thumb_size = (thumb_w,thumb_h) #what if it is too small!?? fix it.
if imagex > imagey:
setlen = imagey
left = (imagex - setlen)/2
top = 0
height = setlen
width = setlen
if imagey > imagex:
setlen = imagex
left = 0
top = (imagey - setlen)/2
heigth = setlen
width = setlen
if imagex == imagey:
left = 0
top = 0
height = imagey
width = imagex
box = (left,top,left+width,top+height)
im = im.crop(box)
#im.thumbnail(thumb_size,Image.ANTIALIAS)
new_file = StringIO()
im.save(new_file,'JPEG')
new_file.seek(0)
except Exception, e:
pass
return new_file
是否有在线脚本可以满足我的需求?
答案 0 :(得分:1)
使用定义为imagex / imagey的宽高比,因此使用3/2代表3:2,16 / 9代表16:9等。
def letterbox(f,aspect_ratio=1):
try:
im = Image.open(StringIO(f))
imagex = int(im.size[0])
imagey = int(im.size[1])
width = min(imagex, imagey*aspect_ratio)
height = min(imagex/aspect_ratio, imagey)
left =(imagex - width)/2
top = (imagey - height)/2
box = (left,top,left+width,top+height)
im = im.crop(box)
new_file = StringIO()
im.save(new_file,'JPEG')
new_file.seek(0)
except Exception, e:
pass
return new_file
您可能希望在某个时刻检查舍入错误,但否则会这样做。
答案 1 :(得分:0)
首先,您的功能名称具有误导性,因为它的作用是不是 letterbox图像(无论涉及的具体高度/宽度[宽高比]) - 所以在这里它被重命名为aspectcrop()
以更好地描述它的作用。
def aspectcrop(f, ratio=1.0):
try:
im = Image.open(StringIO(f))
imagewidth,imageheight = im.size
# determine the dimensions of a crop area
# which is no wider or taller than the image
if int(imagewidth*ratio) > imageheight:
cropheight,cropwidth = imageheight,int(imageheight/ratio)
else:
cropwidth,cropheight = imagewidth,int(imagewidth*ratio)
# center the crop area on the image (dx and/or dy will be zero)
dx,dy = (imagewidth-cropwidth)/2,(imageheight-cropheight)/2
# crop, save, and return image data
im = im.crop((dx,dy,cropwidth+dx,cropheight+dy))
new_file = StringIO()
im.save(new_file,'JPEG')
new_file.seek(0)
except Exception, e:
new_file = None # prevent exception on return
pass
return new_file
如果传递给它的任何方面ratio
参数自然不是整数,请确保它处于浮点状态,如3./2.
而不是3/2
。默认值(1.0
)可能是整数,但我明确地将浮点数作为提醒。将它作为两个单独的整数传递并在内部计算比率可能更好。
最后,我注意到你的示例脚本有一些看似尝试创建图像缩略图的可见痕迹,因此我对相关问题What's the simplest way in Python to resize an image to a given bounded area?的回答可能也很有意义(并且可能可以毫无困难地集成到此功能中。)