将图像裁剪为列

时间:2019-05-13 07:54:55

标签: python python-3.x python-imaging-library

考虑下图:

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 个答案:

答案 0 :(得分:2)

您的区域是:

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()