How do I resize an image using PIL and maintain its aspect ratio?

后端 未结 20 1872
-上瘾入骨i
-上瘾入骨i 2020-11-22 02:30

Is there an obvious way to do this that I\'m missing? I\'m just trying to make thumbnails.

相关标签:
20条回答
  • 2020-11-22 02:42
    import cv2
    from skimage import data 
    import matplotlib.pyplot as plt
    from skimage.util import img_as_ubyte
    from skimage import io
    filename='abc.png'
    image=plt.imread(filename)
    im=cv2.imread('abc.png')
    print(im.shape)
    im.resize(300,300)
    print(im.shape)
    plt.imshow(image)
    
    0 讨论(0)
  • 2020-11-22 02:43

    You can resize image by below code:

    From PIL import Image
    img=Image.open('Filename.jpg') # paste image in python folder
    print(img.size())
    new_img=img.resize((400,400))
    new_img.save('new_filename.jpg')
    
    0 讨论(0)
  • 2020-11-22 02:44

    If you are trying to maintain the same aspect ratio, then wouldn't you resize by some percentage of the original size?

    For example, half the original size

    half = 0.5
    out = im.resize( [int(half * s) for s in im.size] )
    
    0 讨论(0)
  • 2020-11-22 02:48

    This script will resize an image (somepic.jpg) using PIL (Python Imaging Library) to a width of 300 pixels and a height proportional to the new width. It does this by determining what percentage 300 pixels is of the original width (img.size[0]) and then multiplying the original height (img.size[1]) by that percentage. Change "basewidth" to any other number to change the default width of your images.

    from PIL import Image
    
    basewidth = 300
    img = Image.open('somepic.jpg')
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))
    img = img.resize((basewidth,hsize), Image.ANTIALIAS)
    img.save('sompic.jpg') 
    
    0 讨论(0)
  • 2020-11-22 02:48

    I will also add a version of the resize that keeps the aspect ratio fixed. In this case, it will adjust the height to match the width of the new image, based on the initial aspect ratio, asp_rat, which is float (!). But, to adjust the width to the height, instead, you just need to comment one line and uncomment the other in the else loop. You will see, where.

    You do not need the semicolons (;), I keep them just to remind myself of syntax of languages I use more often.

    from PIL import Image
    
    img_path = "filename.png";
    img = Image.open(img_path);     # puts our image to the buffer of the PIL.Image object
    
    width, height = img.size;
    asp_rat = width/height;
    
    # Enter new width (in pixels)
    new_width = 50;
    
    # Enter new height (in pixels)
    new_height = 54;
    
    new_rat = new_width/new_height;
    
    if (new_rat == asp_rat):
        img = img.resize((new_width, new_height), Image.ANTIALIAS); 
    
    # adjusts the height to match the width
    # NOTE: if you want to adjust the width to the height, instead -> 
    # uncomment the second line (new_width) and comment the first one (new_height)
    else:
        new_height = round(new_width / asp_rat);
        #new_width = round(new_height * asp_rat);
        img = img.resize((new_width, new_height), Image.ANTIALIAS);
    
    # usage: resize((x,y), resample)
    # resample filter -> PIL.Image.BILINEAR, PIL.Image.NEAREST (default), PIL.Image.BICUBIC, etc..
    # https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize
    
    # Enter the name under which you would like to save the new image
    img.save("outputname.png");
    

    And, it is done. I tried to document it as much as I can, so it is clear.

    I hope it might be helpful to someone out there!

    0 讨论(0)
  • 2020-11-22 02:49

    The following script creates nice thumbnails of all JPEG images preserving aspect ratios with 128x128 max resolution.

    from PIL import Image
    img = Image.open("D:\\Pictures\\John.jpg")
    img.thumbnail((680,680))
    img.save("D:\\Pictures\\John_resize.jpg")
    
    0 讨论(0)
提交回复
热议问题