Search code examples
pythonsetpython-imaging-librarycrop

Problems cropping entire white lines from .png file


What I want to do is to crop out the white lines above a given instagram print screen. I tried doing that by finding the center of the image and going up, line by line, until I found the first line entirely white. Any idea why my code is not working?

from PIL import Image

image_file = "test.png"
im = Image.open(image_file)
width, height = im.size
centerLine = height // 2

entireWhiteLine = set()
entireWhiteLine.add(im.getpixel((0, 0)))
terminateUpperCrop = 1

while terminateUpperCrop != 2 :

    for i in range(centerLine, 1, -1) :
        entireLine = set()
        upperBorder = i - 1
        for j in range(0, width, 1) :
            entireLine.add((im.getpixel((i, j))))
            if entireLine == im.getpixel((0,0)):
                box = (0, upperBorder, width, height)
                crop = im.crop((box))
                crop.save('test2.png')
                terminateUpperCrop = 2

Solution

  • Your getpixel() call is actually searching with the coordinates the wrong way around, so in effect you were scanning for the left edge. You could use the following approach. This creates a row of data containing only white pixels. If the length of the row equals your width, then you know they are all white.

    from PIL import Image
    
    image_file = "test.png"
    im = Image.open(image_file)
    width, height = im.size
    centerLine = height // 2
    
    white = (255, 255, 255)
    
    for y in range(centerLine, 0, -1) :
        if len([1 for x in range(width) if im.getpixel((x, y)) == white]) == width - 1:
            box = (0, y, width, height)
            crop = im.crop((box))
            crop.save('test2.png')
            break