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.
- determine center of spot want crop
- determine new size using scale factor
- 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:
crop_amsterdam_01.jpg:
crop_amsterdam_02.jpg:
crop_amsterdam_03.jpg:
Comments
Post a Comment