Python3:将矩形图像调整为不同类型的矩形,保持比例并用黑色填充背景

时间:2018-04-15 19:05:53

标签: python python-3.x image

我对此有一个非常类似的问题:Resize rectangular image to square, keeping ratio and fill background with black,但我希望调整大小为非方形图像,并在需要时水平或垂直居中放置图像。

以下是所需输出的一些示例。我完全使用Paint制作了这个图像,因此图像可能实际上并不是完全居中,但是居中是我想要实现的目标:

desired outputs

我尝试了以下从链接问题编辑的代码:

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。大图像的内容,它似乎会旋转它们!

1 个答案:

答案 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))