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

Calcul scientifique Python Discussion :

[PIL] save image


Sujet :

Calcul scientifique Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut [PIL] save image
    Bonjour,

    Je voudrais sauver une image en ram (donc dans un objet par exemple) et non sur le disque dur.

    en effet je veux travailler sur le format fichier et non le format de PIL.Image en mémoire.

    Par exemple,

    im = Image.open("src.bmp")

    im.save(output, "PNG")

    puis manipuler le output qui est lexact réplique en mémoire du fichier .png du disque dur

    en, gros, dhabitude le output est simplement : output = open("dst.png", "wb")
    un file objet classique

    le pb est que ca créé un fichier sur le disque alors que moi je veux simplement manipuler ce png en mémoire

    QQn peut il écrire le code d'un objet qui pourrait me convenir ?

    (je voudrais en gros que ca save mais à une adresse de la ram et non du disque dur)

    merci

    ps: ensuite je veux utiliser la méthode addfile du module tarfile :

    archive.addfile(tarinfo, output)


    edit: je vais essayer avec StringIO
    edit: nop cest pas ce que je veux

  2. #2
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Et pourquoi veux tu que ca soit du PNG. Je m'explique. une fichier image dans pil n'a pas d'entete. (Je crois) L'entete dépendante du format est créer a la sauvegarde. Donc si tu ne sauvegarde pas, il n'y aura pas d'entete.

    Je ne sais pas si mes infos sont vraies mais elle tiennent debout puisque l'on peut sauvegarder parmi plusieurs format une meme image. C'est donc la procédure de sauvegarde qui créer l'entete.

    Je pense que la sauvegarde en dure sur ton disque soit une étape obligatoire.

    Une autre solution ( pas des moindres) :

    tu recréer une fonction qui créer un fichier binaire contenant les entetes du fichier voulu, etc etc plus les datas.

    mais la bon courage.

    Le mieu serait de sauvegarder ton image en dure. et de l'envoyer dans le TAR.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par parp1
    Donc si tu ne sauvegarde pas, il n'y aura pas d'entete.
    cest justement pour ca que je suis obligé de sauvegarder sur le disque


    Citation Envoyé par parp1
    Le mieu serait de sauvegarder ton image en dure. et de l'envoyer dans le TAR.
    oui cest ce que je fais pour linstant bien évidemment, mais justement tout le pb est la, je trouve ca super nul de devoir copier sur le disque pour apres le foutre dans le tar puis supprimer le fichier, ca ralentit considérablement et cest surtout inutile
    (je souhaite utiliser archivetar.addfile(tarinfo, fileobj)) où fileobj représente le fichier png (entete et contenu) en mémoire (et non sur le disque )GG

    mais justement cest ma question , comment avoir un tel fileobj

    ton post est en fait ce que javais constaté et c'est ce cheminement qui ma amené a creer cette discussion ...

    Citation Envoyé par parp1
    tu recréer une fonction qui créer un fichier binaire contenant les entetes du fichier voulu, etc etc plus les datas.
    hors de propos, autant ne pas utiliser la librairie PIL

  4. #4
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Si tu utilise pil pour extraire tes donnée de ton fichier bmp et ta procedure ou fonction ajouter en entete de ces donnée l'entete spécifique du format.

    A mon avis tu vas avoir le droit de developper ta classE.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    hein?

    ma question est simple et pour les utilisateurs chevronés de python je suis sur qu'il ya une solution dans le genre du StringIO = "Crée et renvoie un objet fl assimilable à un fichier en mémoire" (page 250 du livre <<python en concentré>>)

    le pb de StringIO cest que il na pas de name et se construit à partir des données passés en parametre sous forme de chaine.
    Or moi je voudrais un objet qui sinstancie en donnant juste un nom et et se remplie lors de lappel à write, et le tout de type file objet

    ca doit bien existé mais je trouve pas dans la doc, ou je ne sais pas bien où chercher

  6. #6
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Les créateurs de la librairie PIL ont pensé à toi et l'ont écrit dans l'aide en ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> import Image
    >>> help(Image.Image.save)
    Help on method save in module Image:
    
    save(self, fp, format=None, **params) unbound Image.Image method
        Save image to file or stream
    Tu peux donc sauvegarder dans un stream et choisir ton format.

    Reste à tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import StringIO
    import Image
     
    f = StringIO.StringIO()
    i = Image.new('RGB', (150, 150), (10, 10, 255))
    i.save(f, 'png')
    f.seek(0)
    f.read()
    Pas besoin d'être un utilisateur chevronné pour utiliser l'aide en ligne
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par jhonnyBravo
    le pb de StringIO cest que il na pas de name et se construit à partir des données passés en parametre sous forme de chaine.
    Or moi je voudrais un objet qui sinstancie en donnant juste un nom et et se remplie lors de lappel à write, et le tout de type file objet
    En effet j'avais dis qqch de faux, lerreur viens dautre part alors,

    javais tester ca : (sans le seek ni le read, deja merci pour ca )

    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
     
    import StringIO
    from PIL import Image
    import tarfile
     
    f = StringIO.StringIO() 
    i = Image.open("image.bmp")
    i.save(f, 'png')
    f.seek(0)
    f.read()
     
     
    archive = tarfile.open("archive.tar", "w") #je souhaite créer une archive et mettre f dedans.
    tinfo = archive.gettarinfo("image.png", "autre", f) #donne une erreur
    archive.addfile(tinfo, f)
     
    f.close()
    archive.close()
    qui donne une erreur, sais tu comment la résoudre ?


    si vous avez la derniere version de pil et python , vous pouvez copier coller ce code pour obtenir lerreur

  8. #8
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Essaye ça:
    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
    import StringIO
    import Image
    import tarfile
     
    f = StringIO.StringIO() 
    i = Image.new('RGB', (150, 150), (255,255,150))
    i.save(f, 'png')
    f.seek(0)
     
    archive = tarfile.open("archive.tar", "w")
     
    info = tarfile.TarInfo('image.png')
    info.size = f.len
    archive.addfile(info, f)
     
    f.close()
    archive.close()
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    merci bcp ca marche nickel(fallait bien enlever le read() et laisser le seek(0) sinon ca plante)

    je met ici le code pour charger une image bmp et la mettre directement dans une archive, (juste une ligne de plus que ce que tu as posté):

    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
     
    import StringIO
    from PIL import Image
    import tarfile
     
    f = StringIO.StringIO()
    i = Image.open("image.bmp")
    i.save(f, "png")
    f.seek(0)
     
    archive = tarfile.open("archive.tar", "w")
    info = tarfile.TarInfo("image.png")
    info.size = f.len
    archive.addfile(info, f)
     
    f.close()
    archive.close()
    ainsi que l'opération inverse, extraire une png d'une archive et lenregistrer en bmp (également sans passer par un fichier disque temporaire ce qui était le but)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import StringIO
    from PIL import Image
    import tarfile
     
    archive = tarfile.open("archive.tar", "r")
    info = archive.getmembers()[0]
    f = archive.extractfile(info)
     
    im = Image.open(f)
    im.save("image.bmp")
     
    f.close()
    archive.close()
    voila encore merci

    ps: sujet résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bouton Save Image
    Par emmye dans le forum MFC
    Réponses: 5
    Dernier message: 07/05/2012, 14h49
  2. [Débutant] Bouton Save Image
    Par emmye dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/05/2012, 15h57
  3. PIL (Python Imaging Library)
    Par forum dans le forum Téléchargez
    Réponses: 0
    Dernier message: 08/07/2011, 16h58
  4. [PIL] Librairie Image
    Par Corpio dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 13/04/2006, 17h40
  5. [Tkinter et PIL] L'image disparait.......
    Par airod dans le forum Tkinter
    Réponses: 3
    Dernier message: 20/01/2006, 20h44

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