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

Bas*_*asj 5 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")
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

注意:

sar*_*dok 6

我认为一个函数调用是不可能的,因为相关的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")
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明


Jer*_*uke 5

使用PIL模块expand()中提供的功能后,您可以做您想做的事情。ImageOps

\n\n
from PIL import Image\nfrom PIL import ImageOps\nfilename = 'C:/Users/Desktop/Maine_Coon_263.jpg'\nimg = Image.open(filename)\n\nval = 10    #--- pixels to be cropped\n\n#--- a new image with a border of 10 pixels on all sides\n#--- also notice fill takes in the color of white as (255, 255, 255)\nnew_img = ImageOps.expand(img, border = val, fill = (255, 255, 255))\n\n#--- cropping the image above will not result in any black portion\ncropped = new_img.crop((val, val, 150, 150))\n
Run Code Online (Sandbox Code Playgroud)\n\n

crop()函数仅采用一个参数来表示必须裁剪多少部分。没有功能可以处理传入负值时的情况。因此,在传递负值时,图像会用黑色像素填充。

\n\n

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

\n\n

编辑

\n\n

为了回应您的编辑,我想到了一些相当 na\xc3\xafve 的东西,但它有效。

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

这段代码将帮助您:

\n\n
#--- Consider these values in a tuple that are to crop your image \ncrop_vals = (-10, -20, 1000, 500)\n\n#--- get maximum value after obtaining the absolute of each\nmax_val = np.max(np.abs(crop_vals))\n\n#--- add border to the image using this maximum value and crop\nnew_img = ImageOps.expand(img, border = max_val, fill = (255, 255, 255))\ncropped = new_img.crop((max_val - 10, max_val - 20, new_img.size[0], new_img.size[1]))\n
Run Code Online (Sandbox Code Playgroud)\n