我对此有一个非常类似的问题:Resize rectangular image to square, keeping ratio and fill background with black,但我希望调整大小为非方形图像,并在需要时水平或垂直居中放置图像。
以下是所需输出的一些示例。我完全使用Paint制作了这个图像,因此图像可能实际上并不是完全居中,但是居中是我想要实现的目标:
我尝试了以下从链接问题编辑的代码:
def fix_size(fn, desired_w=256, desired_h=256, fill_color=(0, 0, 0, 255)):
"""Edited from https://stackoverflow.com/questions/44231209/resize-rectangular-image-to-square-keeping-ratio-and-fill-background-with-black"""
im = Image.open(fn)
x, y = im.size
#size = max(min_size, x, y)
w = max(desired_w, x)
h = max(desired_h, y)
new_im = Image.new('RGBA', (w, h), fill_color)
new_im.paste(im, ((w - x) // 2, (h - y) // 2))
return new_im.resize((desired_w, desired_h))
然而这并不起作用,因为它仍然会将一些图像拉伸成方形的图像(至少是示例中的图像b。大图像的内容,它似乎会旋转它们!
答案 0 :(得分:1)
问题在于您对图像尺寸的错误计算:
w = max(desired_w, x)
h = max(desired_h, y)
您只需单独获取最大尺寸 - 不考虑图像的纵横比。想象一下,如果您的输入是方形1000x1000图像。您最终会创建一个黑色的1000x1000图像,将原始图像粘贴在其上,然后将其大小调整为244x138。要获得正确的结果,您必须创建一个1768x1000图像而不是1000x1000图像。
这是考虑了宽高比的更新代码:
def fix_size(fn, desired_w=256, desired_h=256, fill_color=(0, 0, 0, 255)):
"""Edited from https://stackoverflow.com/questions/44231209/resize-rectangular-image-to-square-keeping-ratio-and-fill-background-with-black"""
im = Image.open(fn)
x, y = im.size
ratio = x / y
desired_ratio = desired_w / desired_h
w = max(desired_w, x)
h = int(w / desired_ratio)
if h < y:
h = y
w = int(h * desired_ratio)
new_im = Image.new('RGBA', (w, h), fill_color)
new_im.paste(im, ((w - x) // 2, (h - y) // 2))
return new_im.resize((desired_w, desired_h))