使用PIL裁剪图像时的背景颜色

时间:2018-05-25 11:10:06

标签: python image python-imaging-library pillow

PIL.crop的好处是,如果我们想要在图像尺寸之外进行裁剪,它只需使用:

from PIL import Image
img = Image.open("test.jpg")
img.crop((-10, -20, 1000, 500)).save("output.jpg")

问题:如何将添加区域的背景颜色更改为白色(默认值:黑色)?

enter image description here

注意:

2 个答案:

答案 0 :(得分:5)

我认为通过一个函数调用是不可能的,因为相关的C函数似乎将目标图像存储区域清零(参见此处:https://github.com/python-pillow/Pillow/blob/master/src/libImaging/Crop.c#L47

你提到没有兴趣创建新的图像并复制它,但我仍然粘贴这种解决方案以供参考:

from PIL import Image
img = Image.open("test.jpg")
x1, y1, x2, y2 = -10, -20, 1000, 500  # cropping coordinates
bg = Image.new('RGB', (x2 - x1, y2 - y1), (255, 255, 255))
bg.paste(img, (-x1, -y1))
bg.save("output.jpg")

输出:

enter image description here

答案 1 :(得分:3)

使用PIL的expand()模块中提供的ImageOps功能后,您可以执行您想要的操作。

from PIL import Image
from PIL import ImageOps
filename = 'C:/Users/Desktop/Maine_Coon_263.jpg'
img = Image.open(filename)

val = 10    #--- pixels to be cropped

#--- a new image with a border of 10 pixels on all sides
#--- also notice fill takes in the color of white as (255, 255, 255)
new_img = ImageOps.expand(img, border = val, fill = (255, 255, 255))

#--- cropping the image above will not result in any black portion
cropped = new_img.crop((val, val, 150, 150))

crop()函数只接受一个参数,即必须裁剪多少部分。传递负值时没有处理这种情况的功能。因此,在传递负值时,图像将以黑色像素填充。

使用expand()功能,您可以设置您选择的颜色,然后按照您的意愿继续裁剪。

修改

为了回应你的编辑,我有一些相当天真的东西,但它有效。

  • 获取要裁剪的所有值的绝对值。您可以使用numpy.abs()
  • 使用numpy.max()
  • 接下来这些值中的最大值
  • 最后使用此值展开图像并相应裁剪。

此代码可以帮助您:

#--- Consider these values in a tuple that are to crop your image 
crop_vals = (-10, -20, 1000, 500)

#--- get maximum value after obtaining the absolute of each
max_val = np.max(np.abs(crop_vals))

#--- add border to the image using this maximum value and crop
new_img = ImageOps.expand(img, border = max_val, fill = (255, 255, 255))
cropped = new_img.crop((max_val - 10, max_val - 20, new_img.size[0], new_img.size[1]))