1. ホーム
  2. python

[解決済み] 画像を半分に分割しようとすると、「tile cannot extend outside image」エラーが発生します。

2022-02-07 02:28:08

質問内容

私のプログラムでは、画像を取り込んで縦方向にn個のセクションに分割し、セクションを個々のpngファイルとして保存することになっています。2つのセクションの場合、以下のようになるはずです。

画像の前半は正しく保存されるのですが、後半を切り取ろうとすると次のようなエラーが発生します。 SystemError: tile cannot extend outside image

私が扱っている画像は

  • 横幅:1180px
  • 高さ:842px

クロップするために計算される矩形は。

  • (0.0, 0, 590.0, 842) - これは正常に動作します
  • (590.0, 0, 590.0, 842) - プログラムがクラッシュします

質問です。なぜこのサブ矩形は範囲外なのでしょうか、また、どうすれば写真のように画像を適切に半分にスライスできるのでしょうか。

from PIL import Image, ImageFilter


im = Image.open("image.png")
width, height = im.size
numberOfSplits = 2
splitDist = width / numberOfSplits #how many pixels each crop should be in width
print(width, height) #prints 1180, 842

for i in range(0, numberOfSplits):
    x = splitDist * i
    y = 0
    w = splitDist
    h = height

    print(x, y, w, h)
    #first run through prints 0.0, 0, 590.0, 842
    #second run through prints 590.0, 0, 590.0, 842 then crashes

    croppedImg = im.crop((x,y,w,h)) #crop the rectangle into my x,y,w,h
    croppedImg.save("images\\new-img" + str(i) + ".png") #save to file

解決方法は?

ボックスの座標(x, y, w, h)はすべて画像の左上隅から計測されています。

ということで、ボックスの座標は (x, y, w+x, h+y) となるはずです。コードを以下のように変更します。

for i in range(0, numberOfSplits):
    x = splitDist * i
    y = 0
    w = splitDist+x
    h = height+y