Existe-t-il une solution simple pour découper les espaces sur l'image dans PIL?
ImageMagick a un support facile pour cela de la manière suivante:
convert test.jpeg -fuzz 7% -trim test_trimmed.jpeg
J'ai trouvé une solution pour PIL:
from PIL import Image, ImageChops
def trim(im, border):
bg = Image.new(im.mode, im.size, border)
diff = ImageChops.difference(im, bg)
bbox = diff.getbbox()
if bbox:
return im.crop(bbox)
Mais cette solution présente des inconvénients:
border
couleur, ce n'est pas grave pour moi, mes images ont un fond blanc-fuzz
D'ImageMagick. Pour ajouter un recadrage flou. car je peux avoir des artefacts de compression jpeg et des ombres énormes inutiles.Peut-être que PIL a des fonctions intégrées pour cela? Ou existe-t-il une solution rapide?
Je ne pense pas qu'il y ait quoi que ce soit intégré à PIL qui puisse faire cela. Mais j'ai modifié votre code pour qu'il le fasse.
getpixel
, vous n'avez donc pas besoin de passer la couleur.100, 100, 100
(dans mon exemple) à zéro. Il en va de même pour éliminer toute "oscillation" résultant de la compression.Code:
from PIL import Image, ImageChops
def trim(im):
bg = Image.new(im.mode, im.size, im.getpixel((0,0)))
diff = ImageChops.difference(im, bg)
diff = ImageChops.add(diff, diff, 2.0, -100)
bbox = diff.getbbox()
if bbox:
return im.crop(bbox)
im = Image.open("bord3.jpg")
im = trim(im)
im.show()
JPEG fortement compressé:
Tondu:
JPEG bruyant:
Tondu:
en utilisant la fonction trim sur le module ufp.image.
import ufp.image
import PIL
im = PIL.Image.open('test.jpg', 'r')
trimed = ufp.image.trim(im, fuzz=13.3)
trimed.save('trimed.jpg')
Utilisez la baguette http://docs.wand-py.org/en/0.3-maintenance/wand/image.html
trim (couleur = None, fuzz = 0) Supprimer la bordure pleine de l'image. Utilise le pixel supérieur gauche comme guide par défaut, ou vous pouvez également spécifier la couleur à supprimer.