Обрезать изображение в виде столбцов - PullRequest
0 голосов
/ 13 мая 2019

Рассмотрите изображение ниже:

enter image description here

Я пытаюсь создать «простой» метод Python, который может обрезать изображения как столбцы таблицы. Так, например, пользователь может определить на изображении, как оно должно быть обрезано, например:

enter image description here

Здесь пользователь определил три области на изображении, которые должны быть обрезаны, в результате чего получится 4 столбца.

Я пытаюсь использовать PIL, чтобы обрезать его, но, насколько я вижу, он принимает (left, upper, right, lower) tuple:

Учтите, мои столбцы хранятся в формате JSON, например:

#COLUMNS:
{"1": {"position":"20"}, "2": {"position":"50"}, "3": {"position":"70"}}

Таким образом, выше position относится к позиции с левой стороны изображения, по оси X.

Мне трудно решить эту проблему - как я могу обрезать, основываясь только на приведенной выше информации.

Я предполагаю, что мне понадобится полная высота изображения в качестве параметра.

Это то, что я имею до сих пор:

def columnsFromImage():
    img = Image.open(img_file)
    image_name = img.filename

    width, height = img.size
    for col in COLUMNS:
        col = COLUMNS.get(str(col))

        area = () #This is where I am stuck

        output_image = img.crop(area)
        output_image.save(image_name)

Как видите, я застрял в определении области. Я не могу понять, как рассчитать позиции столбцов и обрезать на основе этого.

1 Ответ

2 голосов
/ 13 мая 2019

Ваш район:

upperleft = current column
top = 0
lowerright = next column (column[i+1])
bottom = height of image

Поскольку в последней итерации не будет следующего столбца, чтобы посмотреть на него, я ловлю его и просто использую ширину изображения в качестве последней нижней правой позиции. ниже я привел пример того, как может выглядеть ваш код.

def columnsFromImage():
    img = Image.open(img_file)
    image_name = img.filename

    width, height = img.size

    col = COLUMNS[str(1)]
    area = (0, 0, round(width*(int(col['position'])/100)), int(height))
    output_image = img.crop(area)
    output_image.save(image_name + str(0) + '.png', 'PNG')

    for i, col in enumerate(COLUMNS):
        col = COLUMNS.get(str(col))
        pixelsleftcorner = round(width*(int(col['position'])/100))
        try:
            pixelsrightcorner = round(width * (int(COLUMNS[str(i + 2)]['position']) / 100))
            area = (pixelsleftcorner, 0, pixelsrightcorner, int(height))
        except KeyError:
            area = (pixelsleftcorner, 0, int(width), int(height))
        output_image = img.crop(area)
        output_image.save(image_name+str(i+1)+'.png', 'PNG')

columnsFromImage()
...