考虑下图:
我正在尝试创建一个“简单的” Python方法,该方法可以裁剪表列之类的图像。因此,例如,用户可以在图像上定义应如何裁剪图像,例如:
用户在此处定义了图像上的三个区域,应对其进行裁剪,从而形成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)
如您所见,我被困在定义区域中。我不知道如何计算列位置,并以此为基础进行裁剪。
答案 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()