Crop image with settable center and scale in Python PIL -


i crop image using pil, although other module. need method crop scale factor, ie 1.5 meaning output 1.5x zoomed in. additionally, need set center zooms. means setting x/2,y/2 center zoom straight center, other x,y values zoom pixels.

if knows how appreciate help.

right have cropping working ims = im.crop((int((x-x/i)/2), int((y-y/i)/2), int((x+(x/i))/2), int((y+(y/i))/2))) zooms center, , "i" doesn't give nice scale factor.

again, help.

it matter of getting center , sizes right.

  1. determine center of spot want crop
  2. determine new size using scale factor
  3. determine bounding box of cropped image

the following script should trick.

import os.path pil import image  def get_img_dir():     src_dir = os.path.dirname(__file__)     img_dir = os.path.join(src_dir, '..', 'img')     return img_dir  def open_img():     img_dir = get_img_dir()     img_name = 'amsterdam.jpg'     full_img_path = os.path.join(img_dir, img_name)     img = image.open(full_img_path)     return img  def crop_image(img, xy, scale_factor):     '''crop image around tuple xy      inputs:     -------     img: image opened pil.image     xy: tuple relative (x,y) position of center of cropped image         x , y shall between 0 , 1     scale_factor: ratio between original image's size , cropped image's size     '''     center = (img.size[0] * xy[0], img.size[1] * xy[1])     new_size = (img.size[0] / scale_factor, img.size[1] / scale_factor)     left = max (0, (int) (center[0] - new_size[0] / 2))     right = min (img.size[0], (int) (center[0] + new_size[0] / 2))     upper = max (0, (int) (center[1] - new_size[1] / 2))     lower = min (img.size[1], (int) (center[1] + new_size[1] / 2))     cropped_img = img.crop((left, upper, right, lower))     return cropped_img  def save_img(img, img_name):     img_dir = get_img_dir()     full_img_path = os.path.join(img_dir, img_name)     img.save(full_img_path)  if __name__ == '__main__':     ams = open_img()      crop_ams = crop_image(ams, (0.50, 0.50), 0.95)     save_img(crop_ams, 'crop_amsterdam_01.jpg')      crop_ams = crop_image(ams, (0.25, 0.25), 2.5)     save_img(crop_ams, 'crop_amsterdam_02.jpg')      crop_ams = crop_image(ams, (0.75, 0.45), 3.5)     save_img(crop_ams, 'crop_amsterdam_03.jpg') 

original image: amsterdam.jpg

crop_amsterdam_01.jpg: crop_amsterdam_01.jpg

crop_amsterdam_02.jpg: crop_amsterdam_02.jpg

crop_amsterdam_03.jpg: crop_amsterdam_03.jpg


Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -