Цвет фона при кадрировании изображения с помощью PIL - PullRequest
0 голосов
/ 25 мая 2018

Хорошая вещь с 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 голосов
/ 09 июня 2018

Вы можете делать то, что вы собираетесь после использования функции expand(), доступной в модуле ImageOps модуля PIL.

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]))
0 голосов
/ 06 июня 2018

Я думаю, что это невозможно при одном вызове функции из-за соответствующей функции 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

...