Jess
Jess

Reputation: 205

How can i resize images given a certain ratio?

I have many images of different sizes in my directory, however i want to resize them all by a certain ratio, let's say 0.25 or 0.2, it should be a variable i can control from my code and i want the resulting images to be an output in another directory.

I looked into this approach supplied by this previous question How to resize an image in python, while retaining aspect ratio, given a target size?

Here is my approach,

aspectRatio = currentWidth / currentHeight
heigth * width = area
So,

height * (height * aspectRatio) = area
height² = area / aspectRatio
height = sqrt(area / aspectRatio)
At that point we know the target height, and width = height * aspectRatio.

Ex:

area = 100 000
height = sqrt(100 000 / (700/979)) = 373.974
width = 373.974 * (700/979) = 267.397

but it lacks lots of details for example:how to transform these sizes back on the image which libraries to use and so on..

Edit: looking more into the docs img.resize looks ideal (although i also noticed .thumbnail) but i can't find a proper example on a case like mine.

Upvotes: 3

Views: 3025

Answers (2)

Jess
Jess

Reputation: 205

from PIL import Image


ratio = 0.2
img = Image.open('/home/user/Desktop/test_pic/1-0.png')
hsize = int((float(img.size[1])*float(ratio)))
wsize = int((float(img.size[0])*float(ratio)))
img = img.resize((wsize,hsize), Image.ANTIALIAS)
img.save('/home/user/Desktop/test_pic/change.png')

Upvotes: 3

Patrick Artner
Patrick Artner

Reputation: 51633

You can create your own small routine to resize and resave pictures:

import cv2

def resize(oldPath,newPath,factor): 
    """Resize image on 'oldPath' in both dimensions by the same 'factor'. 
    Store as 'newPath'."""
    def r(image,f):
        """Resize 'image' by 'f' in both dimensions."""
        newDim = (int(f*image.shape[0]),int(f*image.shape[1]))
        return cv2.resize(image, newDim, interpolation = cv2.INTER_AREA)

    cv2.imwrite(newPath, r(cv2.imread(oldPath), factor)) 

And test it like so:

# load and resize (local) pic, save as new file (adapt paths to your system)
resize(r'C:\Pictures\2015-08-05 10.58.36.jpg',r'C:\Pictures\mod.jpg',0.4)
# show openened modified image
cv2.imshow("...",cv2.imread(r'C:\Users\partner\Pictures\mod.jpg'))
# wait for keypress for diplay to close
cv2.waitKey(0)

You should add some error handling, f.e.:

  • no image at given path
  • image not readable (file path permissions)
  • image not writeable (file path permissions)

Upvotes: 1

Related Questions