Python: Image resizing: keep proportion - add white background

前端 未结 3 938
误落风尘
误落风尘 2021-01-02 16:50

I would like to create a Python script to resize images, but not changing its proportions, just by adding a white background

(So, a : 500*700 px im

相关标签:
3条回答
  • 2021-01-02 17:31

    Thanks @Jay D., here a bit more general version:

    from PIL import Image
    
    def resize(image_pil, width, height):
        '''
        Resize PIL image keeping ratio and using white background.
        '''
        ratio_w = width / image_pil.width
        ratio_h = height / image_pil.height
        if ratio_w < ratio_h:
            # It must be fixed by width
            resize_width = width
            resize_height = round(ratio_w * image_pil.height)
        else:
            # Fixed by height
            resize_width = round(ratio_h * image_pil.width)
            resize_height = height
        image_resize = image_pil.resize((resize_width, resize_height), Image.ANTIALIAS)
        background = Image.new('RGBA', (width, height), (255, 255, 255, 255))
        offset = (round((width - resize_width) / 2), round((height - resize_height) / 2))
        background.paste(image_resize, offset)
        return background.convert('RGB')
    
    0 讨论(0)
  • 2021-01-02 17:34

    The other answer didn't work for me, I rewrote it and this worked:

    def resize_with_pad(im, target_width, target_height):
        '''
        Resize PIL image keeping ratio and using white background.
        '''
        target_ratio = target_height / target_width
        im_ratio = im.height / im.width
        if target_ratio > im_ratio:
            # It must be fixed by width
            resize_width = target_width
            resize_height = round(resize_width * im_ratio)
        else:
            # Fixed by height
            resize_height = target_height
            resize_width = round(resize_height / im_ratio)
    
        image_resize = im.resize((resize_width, resize_height), Image.ANTIALIAS)
        background = Image.new('RGBA', (target_width, target_height), (255, 255, 255, 255))
        offset = (round((target_width - resize_width) / 2), round((target_height - resize_height) / 2))
        background.paste(image_resize, offset)
        return background.convert('RGB')
    
    0 讨论(0)
  • 2021-01-02 17:47

    Finally did it :

    def Reformat_Image(ImageFilePath):
    
        from PIL import Image
        image = Image.open(ImageFilePath, 'r')
        image_size = image.size
        width = image_size[0]
        height = image_size[1]
    
        if(width != height):
            bigside = width if width > height else height
    
            background = Image.new('RGBA', (bigside, bigside), (255, 255, 255, 255))
            offset = (int(round(((bigside - width) / 2), 0)), int(round(((bigside - height) / 2),0)))
    
            background.paste(image, offset)
            background.save('out.png')
            print("Image has been resized !")
    
        else:
            print("Image is already a square, it has not been resized !")
    

    Thanks to @Blotosmetek for the suggestion, pasting a centered image is definitely simpler than creating images and combining them !

    PS : If you don't have PIL yet, the library's name to install it with pip is "pillow", not PIL. But still, you use it as PIL in the code.

    0 讨论(0)
提交回复
热议问题