Partage
  • Partager sur Facebook
  • Partager sur Twitter

empiler des images [PIL]

Sujet résolu
    13 juillet 2019 à 11:39:24

    bonjour,

    j'ai fais un code pour empiler des images, (pas les superposer, les mettre l'une à coté de l'autre), déjà je suis un peut surpris que PIL n'ai pas une fonction pour ça mais bon j'ai pas trop cherché par ce que ça faisait un bon exercice;) bref voici le code:

    def merge_image(dire, img1, img2, path): # path est le chemin du dossier ou sera enregistrée l'image 
        """empile ou juxtapose deux images"""
        new_matr = list()
        matr1 = np.array(Image.open(img1).convert("RGBA")).tolist()  # on obtient une liste des valeures RGBA a partir des
        matr2 = np.array(Image.open(img2).convert("RGBA")).tolist()  # images
    
        if dire == "right":
            for ligne1, ligne2 in zip(matr1, matr2):  # on fusionne chaque ligne des images en mettant l'image2 a droite de
                new_matr.append(ligne1 + ligne2)  # l'image1
        elif dire == "left":
            for ligne1, ligne2 in zip(matr1, matr2):  # pareille du coté gauche
                new_matr.append(ligne2 + ligne1)
        elif dire == "top":
            new_matr = matr1 + matr2  # on concatène les matrices
        elif dire == "bottom":
            new_matr = matr2 + matr1  # ...
    
        new_matr = np.array(new_matr)  # on transforme la matrice obtenue en array
        new_matr = new_matr.astype("uint8")  # hum... je sais pas a quoi ça sert...
        new_image = Image.fromarray(new_matr)  # on transforme l'array en image
        new_image.save(path, "PNG")  # on sauve l'image

    il fonctionne mais me parait un peu long...

    de plus j'utilise pycharm et il me dit l.14 et l.16 Class 'Iterable' does not define '__add__', so the '+' operator cannot be used on its instances ??

    si il n'y pas de méthode __add__ comment mon code fonctionne ??

    au passage si vous avez la moindre remarque pour optimiser le code je suis preneur surtout que je risque de beaucoup l'utiliser :).

    merci

    -
    Edité par Blue_Badger 13 juillet 2019 à 11:40:05

    • Partager sur Facebook
    • Partager sur Twitter
      13 juillet 2019 à 12:03:33

      Pour créer une image contenant 2 autres images, l'une à côté de l'autre, vous pouvez créer une image assez grande avec Image.new que vous remplissez avec Image.paste en faisant attentions aux coordonnées.

      Pour la question du '+' entre 2 listes, pas sûr que PyCharm sache introspecter une classe écrite en C.... Et quoi qu'en dise PyCharm, c'est Python qui a le dernier mot.

      -
      Edité par mps 13 juillet 2019 à 13:25:24

      • Partager sur Facebook
      • Partager sur Twitter
        29 juillet 2019 à 18:38:47

        désolé pour l'attente,

        merci pour l'idée, si jamais ça intéresse quelque un, voici le code:

        def merge_img(axe, img1, img2, path, back_color=(0, 0, 0)):
            """
            juxtapose deux images.
            si axe='x' la première image sera mise a droite, la seconde a gauche si axe='y' la première image sera mise en haut,
            la seconde en bas si une image est plus longue que l'autre un espace vide
            apparaîtra, on peut choisir la couleur de cet espace avec back_color
            """
            img1 = Image.open(img1)
            img2 = Image.open(img2)
        
            if axe == "x":
                l = img1.size[0] + img2.size[0]
                if img1.size[1] > img2.size[1]:
                    h = img1.size[1]
                else:
                    h = img2.size[1]
                coords = (img1.size[0], 0)
        
            else:  # axe == "y"
                h = img1.size[1] + img2.size[1]
                if img1.size[0] > img2.size[0]:
                    l = img1.size[0]
                else:
                    l = img2.size[0]
                coords = (0, img1.size[1])
        
            new_img = Image.new("RGBA", (l, h), back_color)
            new_img.paste(img1)
            new_img.paste(img2, coords)
        
            new_img.save(path, "PNG")
        

        il n'est pas tellement plus court, mais il est plus rapide (et plus "propre" il me semble).

        pour la question du "+" je pense que tu a raison, d'autant plus que pycharm génère des classes vides si on tente d'accéder au classes écrites en C, il va sûrement chercher les méthodes disponibles dans ces classes vides lors des inspections du code.

        quoi qu'il en soit, sujet résolut:).


         

        • Partager sur Facebook
        • Partager sur Twitter

        empiler des images [PIL]

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown