Comment couper la zone frontière vierge d'une image PNG et la réduire à sa taille minimale à l'aide de Python? P>
6 Réponses :
Vous pouvez utiliser PIL pour trouver des lignes et des cols de votre image composée purement de votre couleur de bordure. p>
Utilisation de ces informations, vous pouvez facilement déterminer les étendues de l'image incrustée. P>
PIL à nouveau vous permettra ensuite de recadrer l'image pour enlever la bordure. P>
PIL '' S getbox fonctionne pour moi
im.getbbox () => 4 tuple ou aucun p>
calcule la boîte de sélection de la régions non nulles dans l'image. Les La boîte à bornes est renvoyée sous forme de 4 tuple Définir la gauche, la partie supérieure, la droite, et Coordonnée de pixels inférieure. Si l'image est complètement vide, cette méthode retourne aucun. p> blockQuote>
code de code que j'ai essayé, j'ai testé avec BMP, mais cela devrait fonctionner aussi pour PNG. P>
import Image im = Image.open("test.bmp") im.size # (364, 471) im.getbbox() # (64, 89, 278, 267) im2 = im.crop(im.getbbox()) im2.size # (214, 178) im2.save("test2.bmp")
Il semble que cela ne fonctionne pas pour les fichiers PNG (fabriqués avec MSPaint par exemple). Peut-être à cause de la transparence ou de quelque chose d'autre?
https://gist.github.com/3141140
import Image import sys import glob # Trim all png images with alpha in a folder # Usage "python PNGAlphaTrim.py ../someFolder" try: folderName = sys.argv[1] except : print "Usage: python PNGPNGAlphaTrim.py ../someFolder" sys.exit(1) filePaths = glob.glob(folderName + "/*.png") #search for all png images in the folder for filePath in filePaths: image=Image.open(filePath) image.load() imageSize = image.size imageBox = image.getbbox() imageComponents = image.split() if len(imageComponents) < 4: continue #don't process images without alpha rgbImage = Image.new("RGB", imageSize, (0,0,0)) rgbImage.paste(image, mask=imageComponents[3]) croppedBox = rgbImage.getbbox() if imageBox != croppedBox: cropped=image.crop(croppedBox) print filePath, "Size:", imageSize, "New Size:",croppedBox cropped.save(filePath)
Je pense qu'il est nécessaire de compléter la réponse de @frank Krueger. Il fait un bon point, mais cela n'inclut pas comment recadrer correctement la couleur de la frontière supplémentaire de l'image. J'ai trouvé que ici . Plus précisément, j'ai trouvé cela utile:
J'ai eu le même problème aujourd'hui. Voici ma solution pour cultiver les frontières transparentes. Il suffit de lancer ce script dans votre dossier avec vos fichiers de fichier .png de lot:
Voici une solution prête à l'emploi: exemple d'entrée ( Lien de téléchargement si vous voulez essayer): p>
La taille de la zone frontalière est-elle statique? Si oui, vous pouvez essayer d'utiliser ImageMagick Bindings Python.
La taille de la bordure vierge n'est pas une valeur fixe, elle varie selon l'image.