PIL.crop
は、画像のサイズの外側をトリミングする場合、次のように機能します。
from PIL import Image
img = Image.open("test.jpg")
img.crop((-10, -20, 1000, 500)).save("output.jpg")
質問:追加された領域の背景色を白(デフォルト:黒)に変更するにはどうすればよいですか?
注意:
可能であれば、crop
を保持し、新しい画像を作成して、次のようにトリミングした画像をそこに貼り付ける必要がないようにします 画像をトリミングし、写真領域が十分でない場合は黒い領域を変更します。白 。
元の画像へのダウンロードリンクは次のとおりです: https://i.stack.imgur.com/gtA70.jpg (303x341ピクセル)
宛先の画像メモリ領域をゼロにするように見える関連する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")
出力:
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]))
_