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.