Logiciel gratuit pour rogner une image à ras bord du motif

ChercheJ Messages postés 205 Statut Membre -  
 alarache -

Bonjour,
je recherche un logiciel qui, lorsque l'on y charge une image ayant une bordure blanche, rogne celle-ci à ras bord du motif.

J'ai trouvé celui-ci :
"https://www.deleze.name/marcel/photo/transfim/rogne/recadre.html".
Il n'est pas mal mais il ne fonctionne pas toujours car j'ai chargé plusieurs images qui n'ont pas été rognées jusqu'au ras bord du motif, c'est dommage.

En connaîtriez-vous d'autres du même genre ?

Je vous remercie par avance pour votre aide.
J.

3 réponses

  1. monpoit-henry Messages postés 3335 Date d'inscription   Statut Membre Dernière intervention   748
     

    Salut,

    Quelle coincidence je viens juste de rogner sur mon Pc une photo avec simplement la galerie de photo, en haut la fonction ROGNER


    1
  2. ChercheJ Messages postés 205 Statut Membre 5
     

    Personne n'a d'idée ?

    P.S. : pourquoi le sujet a été déplacé dans la catégorie "Graphisme" ?
    C'est un logiciel que je recherche...

    0
  3. alarache
     

    Salut,

    Si tu as python 3 installé sur ton système, sinon installe-le installe aussi pillow :P

    Puis lance ce petit script maison, il s'appuie sur la couleur la plus commune des pixels du pourtour de l'image pour déterminer la couleur du fond de l'image.

    try:
        from PIL import Image
    except ImportError:
        print('Ce script nécessite pillow !', '\n')
        exit(
            'Installez-le avec la commande :'
            ' « python -m pip install pillow »'
        )
    
    class ImageReframe:
        def __init__(self, image):
            self._image = image
            frame_color = self._get_most_common_color()
            self._coords = dict(
                top=self._get_top(frame_color),
                bottom=self._get_bottom(frame_color),
                left=self._get_left(frame_color),
                right=self._get_right(frame_color),
            )
            # left, top, right, bottom
            self._new_image = self._image.crop(
                (
                    self._coords['left'], self._coords['top'],
                    self._coords['right'], self._coords['bottom']
                )
            )
    
        def __call__(self):
            return self._new_image
    
        def _get_most_common_color(self):
            colors = {}
            for y in (0, self._image.height - 1):
                for x in range(self._image.width):
                    color = self._image.getpixel((x, y))
                    try:
                        colors[color] += 1
                    except KeyError:
                        colors[color] = 1
            for x in (0, self._image.width - 1):
                for y in range(self._image.height):
                    color = self._image.getpixel((x, y))
                    try:
                        colors[color] += 1
                    except KeyError:
                        colors[color] = 1
            return max(colors, key=lambda v: v[1])
    
    
        def _get_top(self, color):
            for y in range(self._image.height):
                for x in range(self._image.width):
                    if self._image.getpixel((x, y)) != color:
                        return max(0, y - 1)
    
        def _get_bottom(self, color):
            for y in range(self._image.height - 1, -1, -1):
                for x in range(self._image.width):
                    if self._image.getpixel((x, y)) != color:
                        return min(self._image.height - 1, y + 1)
    
        def _get_left(self, color):
            for x in range(self._image.width):
                for y in range(self._image.height):
                    if self._image.getpixel((x, y)) != color:
                        return max(0, x - 1)
    
        def _get_right(self, color):
            for x in range(self._image.width - 1, -1, -1):
                for y in range(self._image.height):
                    if self._image.getpixel((x, y)) != color:
                        return min(self._image.width - 1, x + 1)
    
    if __name__ == '__main__':
        import os
        import argparse
        import mimetypes
        images_mimes = (
            'image/bmp',
            'image/gif',
            'image/jpeg',
            'image/png',
            'image/webp',
        )
        HELP = f'''
    PROGRAMME DE ROGNAGES D'IMAGES
    
    formats d'images supportés : {
        ', '.join(mime.split('/')[1] for mime in images_mimes)
    }
    
    ==============================
    
    --help -h   : affiche cette aide.
    
    ==============================
    
    Rognage d'une image simple :
    
    --image -i  : chemin vers l'image
    --new -n    : chemin où enregistrer l'image recadrée
                  si non stipulée, la nouvelle image sera affichée
    
    ==============================
    
    Rognages des images d'un répertoire :
    
    --fromdir -fd   : chemin vers le répertoire des images à rogner
    --savedir -sd   : chemin vers le répertoire des images rognées à
                      enregistrer
    '''
        parser = argparse.ArgumentParser()
        parser.add_argument('--image', '-i', type=str, action='store')
        parser.add_argument('--new', '-n', type=str, action='store')
        parser.add_argument('--fromdir', '-fd', type=str, action='store')
        parser.add_argument('--savedir', '-sd', type=str, action='store')
        try:
            args = parser.parse_args()
        except ValueError as e:
            exit(e)
    
        if args.image:
            if args.dir or args.save_dir:
                print(
                    "[ATTENTION] seul --new peut être stipulé si --image"
                    "l'est."
                )
            if not os.path.exists(args.image):
                exit(f"[ERREUR] L'image {args.image} n'existe pas.")
            if args.new:
                if os.path.exists(args.new):
                    exit(
                        f"[ERREUR] Le fichier {args.new} existe déjà, ne"
                        " peut l'écraser."
                    )
                else:
                    image = Image.open(args.image)
                    new = ImageReframe(image)()
                    new.save(args.new)
            else:
                image = Image.open(args.image)
                new = ImageReframe(image)()
                new.show()
        elif args.fromdir and args.savedir:
            if not os.path.isdir(args.fromdir):
                exit(
                    f"[ERREUR] Le répertoire {args.fromdir} n'existe pas"
                    " ou n'est pas un répertoire."
                )
            if not os.path.isdir(args.savedir):
                exit(
                    f"[ERREUR] Le répertoire {args.savedir} n'existe pas"
                    " ou n'est pas un répertoire."
                )
            for fyle in os.listdir(args.fromdir):
                if mimetypes.guess_type(fyle)[0] in images_mimes:
                    image = Image.open(f'{args.fromdir}/{fyle}')
                    new = ImageReframe(image)()
                    filename = os.path.basename(fyle)
                    new.save(f'{args.savedir}/{filename}')
                    print(filename, 'recadré et enregistré.')
        else:
            print(HELP.strip())
    

    Enregistre ce code dans un fichier rogner.py

    Puis pour l'exécuter :

    python rogner_image.py -i chenim_vers_image

    Affichera directement l'image modifiée sans l'enregistrer.

    Par exemple :

    python rogner_image.py -i /home/bibi/images/dog.png

    ---

    python rogner_image.py -i chenim_vers_image -n chemin_destination_image_rognée

    Enregistrera l'image rognée vers la destination.

    par exemple :

    python rogner_image.py -i /home/bibi/images/dog.png -n /home/bibi/dog_2.png

    ---

    python rogner_image.py -fd chemin_répertoire_source -sd chemin_répertoire_destination

    Rognera chaque images de la source et l'enregistrera dans la destination

    Par exemple :

    python rogner_image.py -fd /home/bibi/images/animaux -sd /home/bibi/images/animaux_nouveaux

    ATTENTION, dans ce cas, aucune vérification n'est faite sur l'écrasement de fichiers existants dans le répertoire de destination (la flemme :D )

    0