12
votes

Crop d'une image PNG à sa taille minimale

Comment couper la zone frontière vierge d'une image PNG et la réduire à sa taille minimale à l'aide de Python?


2 commentaires

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.


6 Réponses :


0
votes

Vous pouvez utiliser PIL pour trouver des lignes et des cols de votre image composée purement de votre couleur de bordure.

Utilisation de ces informations, vous pouvez facilement déterminer les étendues de l'image incrustée.

PIL à nouveau vous permettra ensuite de recadrer l'image pour enlever la bordure.


0 commentaires

27
votes

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")


1 commentaires

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?



3
votes

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)


0 commentaires

0
votes

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: xxx


0 commentaires

4
votes

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: xxx


0 commentaires

3
votes

Voici une solution prête à l'emploi: xxx

exemple d'entrée ( Lien de téléchargement si vous voulez essayer):

 Entrez la description de l'image ici

sortie: < p>  Entrez la description de l'image ici


0 commentaires