bugfix> python > 投稿

良いこと 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ピクセル)

回答 2 件
  • 目的の画像メモリ領域をゼロにするように見える関連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")
    
    

    出力:

  • 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()  関数は、トリミングする必要がある部分のパラメータを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]))
    
    

あなたの答え