web-dev-qa-db-ja.com

PILで画像をトリミングするときの背景色

PIL.crop は、画像のサイズの外側をトリミングする場合、次のように機能します。

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

質問:追加された領域の背景色を白(デフォルト:黒)に変更するにはどうすればよいですか?

enter image description here

注意:

7
Basj

宛先の画像メモリ領域をゼロにするように見える関連するC関数のため、1回の関数呼び出しでは不可能だと思います(ここを参照してください: 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

6
sardok

PILのImageOpsモジュールで使用可能なexpand()関数を使用した後、意図したことを実行できます。

_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()関数は、トリミングする必要のある部分のパラメーターを1つだけ取ります。負の値が渡された場合の状況を処理する機能はありません。したがって、負の値を渡すと、画像は黒いピクセルで埋められます。

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]))
_
4
Jeru Luke