pythonpython-imaging-library

Polygon crop/clip using Python / PIL


The polygon points along with the uncut, original image are sent by client to the server.

Is there a way that I can clip (crop) the original image along these points in Python server, and save the cropped image? I am currently using PIL, and would prefer a PIL or PIL extended solution.

Thanks in advance


Solution

  • I found a solution using numpy and PIL- so thought I will share:

    import numpy
    from PIL import Image, ImageDraw
    
    # read image as RGB and add alpha (transparency)
    im = Image.open("crop.jpg").convert("RGBA")
    
    # convert to numpy (for convenience)
    imArray = numpy.asarray(im)
    
    # create mask
    polygon = [(444,203),(623,243),(691,177),(581,26),(482,42)]
    maskIm = Image.new('L', (imArray.shape[1], imArray.shape[0]), 0)
    ImageDraw.Draw(maskIm).polygon(polygon, outline=1, fill=1)
    mask = numpy.array(maskIm)
    
    # assemble new image (uint8: 0-255)
    newImArray = numpy.empty(imArray.shape,dtype='uint8')
    
    # colors (three first columns, RGB)
    newImArray[:,:,:3] = imArray[:,:,:3]
    
    # transparency (4th column)
    newImArray[:,:,3] = mask*255
    
    # back to Image from numpy
    newIm = Image.fromarray(newImArray, "RGBA")
    newIm.save("out.png")