IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Question Urgente] Edupython et crop


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut [Question Urgente] Edupython et crop
    Bonjour,
    Je suis en terminale S spé ISN et mon professeur m'a demandé de faire un projet avec edupython et son interface graphique PIL.
    Seul problème j'ai utilisé une fonction "crop" et ce professeur m'a demandé de la définir moi-même, ce que j'ai tenté de faire... Je met a votre disposition mon code et j'espère que vous pourrez m'aider et me corriger.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    from PIL import Image #importer les fonctions images#
    from random import *  #importer toutes les fonctions aléatoires#
     
    permut = [] #création d'un vecteur#
     
    img = Image.open("chiens-poker.jpg") #chargement de l'image#
     
    larg, haut = img.size #permet d'avoir les dimensions de l'image#
    siz = (larg, haut)
     
    mc = input ("Découpage en largeur") #demande à l'utilisateur le nombre de carré souhaité en largeur#
    nc = input ("Découpage en hauteur") #demande à l'utisateur le nombre de carré souhaité en hateur#
    m = int(mc) #on choisit de prendre des entiers pour m#
    n = int(nc) #ainsi que pour n#
    p = m*n #résultat du nombre de carrés attendu en fonction de m et de n#
    print (p) #affichage de p pour une visualisation du nombre de carrés demandés pour les découpages de l'image#
     
    permut = [i for i in range(p)] #initialisation du vecteur#
    shuffle (permut) #permutation des nombres de 0 à p#
     
    #NB : la fonction shuffle ici présentée est le fruit de nombreuses heures de recherches pour un alégement du code et une meilleure lisibilité#
    #De ce fait, la fonction shuffle remplace un code complexe permettant de permuter le numéro de la case avec une autre#
     
    for i in range(p):
        print (i, permut [i]) #affichage des permutations#
     
    kmg = Image.new("RGB", siz) #création d'une image vide dans le programme, acceptation des couleurs pour l'image#
    la = int(larg/m) #nombre de pixel en largeur et
    ha = int(haut/n) #hauteur de case#
     
    #La suite du code permet de faire la permutation des morceaux desimages dans les cases suite au découpage et à la nouvelle position des morceaux des images voulu par shuffle#
     
     
    for i in range(p): #balaye toutes les cases de la nouvelle image#
        x1 = i%m #coordonné de i par projection en x#
        y1 = int(i/m) #coordonné de i par projection en y#
        x2 = permut[i]%m #coordonné de permut[i] par projection en x#
        y2 = int(permut[i]/m) #coordonné de permut[i] par projection en y#
        box =(x2*la, y2*ha, (x2+1)*la, (y2+1)*ha) #pour utiliser sel, il faut le nombre de pixel du point en haut à gauche et en bas à droite pour la délimitation du découpage image#
        def sel(self, box=None):
            self.load()
            if box is None:
                return self.copy()
                return _ImageCrop(self, box)
                jmg = img.sel(box) #utilisation d'une image intermédiaire qui prend le bout d'image d'origine calculé avec box#
                box1 = (x1*la, y1*ha) #calcul des coordonnées pour la redirection du bout d'image d'origine, contenu dans jmg, dans la nouvelle image kmg (nb de pixel comme pour crop)#
                kmg.paste(jmg, box1) #vide jmg dans kmg#
     
    kmg.save('Résultat.png') #sauvegarde de l'image sur le disque#
    kmg.show() #apparition de la nouvelle image#
    Bien sur je vous fourni l'image allant avec ce programme :Nom : chiens-poker.jpg
Affichages : 618
Taille : 31,4 Ko

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,

    "crop" permet de raboter les côtés de l'image.
    Autrement dit, on découpe un rectangle dans l'image initiale.
    Pour faire çà "à la mimine", on peut recopier les points qui vont bien de l'image originale dans une nouvelle image.
    Côté code "yaka" écrire un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> from PIL import Image
    >>> 
    >>> image = Image.open('chiens-poker.jpg')
    >>> count = 100
    >>> new_image = Image.new('RGB', (count, count))
    >>> for i in range(count):
    >>>     for j in range(count):
    >>>         px = image.getpixel((i, j))
    >>>         new_image.putpixel((i,j), px)
    >>> new_image.save('foo.jpg')
    >>> new_image.show()
    Reste à ajouter l'interface utilisateur combien enlever à droite, à gauche, en haut, en bas...
    Et ajuster le code pour "tester" que ces valeurs sont valides et ajouter des offsets.

    - W

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Merci, mais je me demande si l'interface utilisateur est vraiment obligatoire ? Par ailleurs n'ayant que peu de connaissances en informatique, je me demande ce qu'est un offset ?
    EDIT : Je viens de tester ton code et j'obtiens ça : Nom : Résultat.png
Affichages : 715
Taille : 38,6 Ko c'est normal ou pas ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Citation Envoyé par Louis63584 Voir le message
    EDIT : Je viens de tester ton code et j'obtiens ça : ... c'est normal ou pas ?
    Si vous n'avez aucune idée du résultat que vous cherchez à obtenir, je ne peux pas l'inventer: c'est votre exercice.

    Citation Envoyé par Louis63584;810 9952
    Merci, mais je me demande si l'interface utilisateur est vraiment obligatoire ? Par ailleurs n'ayant que peu de connaissances en informatique, je me demande ce qu'est un offset ?
    Mon code découpe le rectangle (0, 0, 100, 100).
    Vous pourriez vouloir découper (100, 200, 300, 400) ou autre.
    L'interface utilisateur, c'est juste saisir d'une façon ou d'une autre les dimensions du rectangle à découper.
    Et vous voyez bien que découper de 100 à 200 c'est commencer par prendre lle pixel en (100, y), .... pour le placer en (0, y).
    Si vous voulez traduire cela en boucle for, il faudra écrire lire 100 + x et écrire en x.

    - W

  5. #5
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Bien sur que j'ai une idée : Nom : Résultat.png
Affichages : 615
Taille : 155,1 Ko Voilà ce que j'obtiens en n'utilisant que crop facilement.

    Je pense avoir compris : il ne prend que le bout d'image en haut à gauche et il le répète. Ainsi, il faut créer une boucle prenant chaque bout pour afficher le résultat final ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Ce que je voudrais en fait c'est découper l'image en rectangles et envoyer chaque rectangle dans un endroit aléatoire et non pas un seul.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Citation Envoyé par Louis63584 Voir le message
    Ce que je voudrais en fait c'est découper l'image en rectangles et envoyer chaque rectangle dans un endroit aléatoire et non pas un seul.
    Je vous ai montré comment découper et coller le bout dans une nouvelle image.
    Il vous reste à adapter.
    note: si on fait l'exo. à votre place vous n'apprendrez pas grand chose...

    - W

  8. #8
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Oui c'est vrai, merci beaucoup !

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,

    Une solution pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    # -*- coding:utf-8 -*-
    from PIL import Image
    import random
     
    def get_rc():
     
        def get_integer(prompt):
            while 1:
                n = raw_input(prompt)
                if n and n.isdigit():
                    return int(n)
                print("* %s n'est pas un nombre")
     
        clns = get_integer("#bandes en largeur: ")
        rows = get_integer("#bandes en hauteur: ")
        return clns, rows
     
    def map_image(image, columns, rows):
     
        def create_map(columns, rows):
            areas = [ (x, y) for y in range(rows) for x in range(columns) ]
            x = areas[:]
            random.shuffle(areas)    
            return zip(x, areas)
     
        w, h = image.size
        dw, dh = w // columns, h // rows
        new_img = Image.new('RGB', (w, h))
     
        for (si, sj), (ti, tj) in create_map(columns, rows):
            for u in range(dw):
                for v in range(dh):
                    px = image.getpixel( (si * dw + u, sj * dh + v) )
                    new_img.putpixel( (ti * dw + u, tj * dh + v), px)            
     
       return new_img
     
    if __name__ == '__main__':
        clns, rows = get_rc()
        image = Image.open('chiens-poker.jpg')
        new_img = map_image(image, clns, rows)
        new_img.show()
    Mais pas sûr que ces constructions soient facilement lisibles.

    - W

  10. #10
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Concernant ton code, j'ai quelques questions. Tout d'abord, j'ai essayé de le faire tourner et il m'a indiqué quelques erreurs comme la non-définition de raw_input et de get_integer. Dois-je les définir moi-même pour apprendre ou dois-je les faire demander à l'utilisateur ?

    En tout cas, c'est très sympathique à toi de vouloir m'aider, même si j'étais proche du but je pense.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Citation Envoyé par Louis63584 Voir le message
    Concernant ton code, j'ai quelques questions. Tout d'abord, j'ai essayé de le faire tourner et il m'a indiqué quelques erreurs comme la non-définition de raw_input et de get_integer. Dois-je les définir moi-même pour apprendre ou dois-je les faire demander à l'utilisateur ?
    raw_input est parce que PIL est installé chez moi sur une version 2.7. Sur Python3, il faut le remplacer par "input"

    En tout cas, c'est très sympathique à toi de vouloir m'aider, même si j'étais proche du but je pense.
    Je ne l'ai pas écrit pour vous mais pour me faire plaisir

    - W

  12. #12
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    En tout cas, le plus important c'est que vous vous soyez amusés en m'aidant .

Discussions similaires

  1. Question urgente Cognos : emploi
    Par Pirotes31 dans le forum Cognos
    Réponses: 8
    Dernier message: 20/12/2010, 14h26
  2. Question urgente sur les triggers
    Par devdev dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/11/2004, 10h38
  3. [FileMaker 6] Questions urgente sur type de base de donnee
    Par LAPLACE dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 06/09/2004, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo