web-dev-qa-db-fra.com

Pourquoi la vignette ne peut-elle pas étendre l'erreur d'image extérieure lorsque j'essaie de diviser l'image en deux?

Mon programme est censé prendre une image et la diviser verticalement en n sections, puis enregistrer les sections en tant que fichiers png individuels. Cela devrait ressembler à ceci pour 2 sections

enter image description here

J'ai des problèmes en ce moment, ce que j'obtiens c'est que la première moitié de mon image est enregistrée correctement, puis j'obtiens l'erreur suivante quand il essaie de recadrer la seconde moitié: SystemError: tile cannot extend outside image

L'image avec laquelle je travaille a

  • Largeur: 1180px
  • Hauteur: 842px

Les rectangles qu'il calcule pour recadrer sont:

  • (0.0, 0, 590.0, 842) - cela fonctionne correctement
  • (590.0, 0, 590.0, 842) - cela plante le programme

Mes questions sont les suivantes: pourquoi ce sous-rectangle est-il hors limites et comment puis-je le corriger pour découper correctement mon image en deux comme indiqué sur l'image?

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
10
Keatinge

Toutes les coordonnées de la boîte (x, y, w, h) sont mesurées à partir du coin supérieur gauche de l'image.

les coordonnées de la boîte doivent donc être (x, y, w + x, h + y). Apportez les modifications suivantes au code.

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