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

Bibliothèques tierces Python Discussion :

image à partir de bytes


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    mars 2006
    Messages
    928
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2006
    Messages : 928
    Points : 1 341
    Points
    1 341
    Par défaut image à partir de bytes
    Hello,

    j'ai fait un petit outil en python qui fabrique les quelques toutes petites images qui serviront d'icônes sur un LCD OLED monochrome connecté à une Arduino. L'outil génère le code C pour déclarer les tableaux de bytes des icônes mais il lui manque une fonction qui m semble importante, c'est la visualisation à la volée des blocs de bytes générés.

    J'ai pensé à la bibliothèque Image de PIL qui permet d'afficher une image grâce à sa méthode .show(). J'ai un problème de compréhension des différents format d'images, mais il me semble que pour convertir un tableau de bytes en image, il faut au moins la largeur et la hauteur... L'exemple ci-dessous trouvé sur la toile fonctionne, j'en déduis que les infos largeur et hauteur sont bien quelque part dan le tableau de bytes.

    Quelqu'un a une idée comment faire une fonction qui permettrait au module Image de convertir des bytes en image? Quelque chose du genre

    def getImageFromBytes(array_of_bytes_, width, height):

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
    from PIL import Image
    from io import BytesIO
     
    # PNG data
    LEFT_THUMB = (
        b'\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00'
        b'\x00\x13\x00\x00\x00\x0B\x08\x06\x00\x00\x00\x9D\xD5\xB6\x3A\x00\x00\x01'
        b'\x2E\x49\x44\x41\x54\x78\x9C\x95\xD2\x31\x6B\xC2\x40\x00\x05\xE0\x77\x10'
        b'\x42\x09\x34\xD0\x29\x21\x82\xC9\x9C\x2E\x72\x4B\x87\x40\x50\xB9\xBF\x5B'
        b'\x28\x35\xA1\xA4\x94\x76\x68\x1C\x1C\x74\xCD\x9A\xE8\x20\x0A\x12\xA5\x5A'
        b'\xE4\x72\xC9\x75\x10\x6D\xDC\xCE\xF7\x03\x3E\xDE\x83\x47\xA4\x94\x68\x67'
        b'\xB5\xD9\x4E\xBF\xBF\x3E\xE8\x78\x3C\x86\x6A\x3C\xCF\x43\x10\x04\x20\x6D'
        b'\x6C\xB5\xD9\x4E\x93\xF8\x95\x5A\x96\x05\xC6\x98\x32\x56\x14\x05\x46\xA3'
        b'\x11\xB4\x36\x14\xBD\x3C\xD3\x4E\xA7\x03\xC6\x18\x8E\xC7\x23\x9A\xA6\x51'
        b'\xC2\x5C\xD7\x45\x9E\xE7\x27\xEC\x0C\x39\x8E\x03\xC6\x18\x0E\x87\x83\x32'
        b'\x04\x00\xE7\x75\x1A\xE7\x7C\xF2\xF9\xFE\x46\x6D\xDB\x06\x63\x0C\xFB\xFD'
        b'\x1E\x75\x5D\x2B\x43\x57\x58\xF9\xF3\xAB\xAD\xD7\x6B\x98\xA6\x09\x21\x04'
        b'\x76\xBB\x1D\x84\x10\x37\x61\x86\x61\x9C\x30\x00\x70\x1C\x07\x49\x92\x80'
        b'\x10\x82\x7E\xBF\x8F\xE5\x72\x79\x13\x78\x69\xF6\x70\x6F\x88\x5E\xAF\x37'
        b'\x2B\xCB\x92\xC6\x71\x0C\x42\x08\xC2\x30\xC4\x7C\x3E\x57\x06\x2F\x98\xAE'
        b'\xEB\x4F\xAE\xEB\x4E\x06\x83\xC1\x4C\x4A\x49\xA3\x28\x82\x94\x12\x61\x18'
        b'\x2A\x37\x5B\x2C\x16\xE8\x76\xBB\xFF\x3F\xE3\x9C\x4F\x8A\xA2\xD0\xD2\x34'
        b'\xA5\x59\x96\xA1\xAA\x2A\x65\xCC\xB2\x2C\x0C\x87\xC3\xEB\xD3\x9E\xC1\xAA'
        b'\xAA\xEE\x38\xE7\x4A\x90\xAE\xEB\x00\x00\xDF\xF7\x1F\xFF\x00\x09\x7C\xA7'
        b'\x93\xB1\xFB\xFA\x11\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82'
    )
     
    stream = BytesIO(LEFT_THUMB)
     
    image = Image.open(stream).convert("RGBA")
    stream.close()
    image.show()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 002
    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 : 18 002
    Points : 31 131
    Points
    31 131
    Par défaut
    Salut,

    L'exemple est un fichier au format PNG... et dans les en-têtes, il y a ce qu'il faut pour permettre à PIL de savoir que c'est du PNG et comment décoder le contenu.

    Dans votre cas, on peut envisager de faire un tableau numpy et d'utiliser Image.fromarray pour en faire une "image".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    mars 2006
    Messages
    928
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2006
    Messages : 928
    Points : 1 341
    Points
    1 341
    Par défaut
    Merci beaucoup Wiztricks, entre temps, j'ai trouvé LA solution. Elle est fournie par le module Image de PIL, toute faite, prête à utiliser. C'est la méthode

    PIL.Image.frombytes(mode, size, data, decoder_name='raw', *args)

    Trouvée ici: https://pillow.readthedocs.io/en/sta...nce/Image.html

    Dans mon cas:

    mode = "1" une seule couleur
    size = (64, 64)
    data mon tableau de bytes
    decoder_name = "raw" je ne sais pas pourquoi, mais je ne touche pas

    Après une transformation à la hussarde du code C en script python, voici le script qui marche. La sinusoïde qui n'en est pas une, c'est un autre problème, je suis dessus aussi.

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    from PIL import Image
    import PIL
     
    bytes_from_C = (
    #~ const PROGMEM byte sinusIcon[] = 
    #~ {
        0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 
        0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 
        0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 
        0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 
        0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 
        0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 
        0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 
        0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 
        0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 
        0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 
        0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 
        0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 
        0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 
        0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 
        0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 
        0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 
        0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
        0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
        0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
        0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 
        0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 
        0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 
        0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 
        0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 
        0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 
        0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 
        0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 
        0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 
        0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 
        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 
        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 
        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 
        0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 
        0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 
        0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 
        0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 
        0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 
        0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 
        0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 
        0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 
    #~ };
    )
     
    bytes_array = bytes(bytes_from_C)
    image = PIL.Image.frombytes("1", (64, 64), bytes_array, decoder_name='raw')
    image.show()

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 002
    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 : 18 002
    Points : 31 131
    Points
    31 131
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Merci beaucoup Wiztricks, entre temps, j'ai trouvé LA solution. Elle est fournie par le module Image de PIL, toute faite, prête à utiliser.
    Désolé de ne pas avoir pris le temps de relire la documentation de Pillow: je passe toujours par numpy pour fabriquer/modifier mes images. Je n'ai jamais eu à récupérer des "bytes": si je dois créer des images, je les sauvegarde dans un format PNG ou autre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Créer une image à partir d'un tableau de bytes
    Par rockley dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 21/12/2011, 13h59
  2. Afficher une image à partir d'un tableau de byte
    Par Fr3nchK1ss dans le forum JavaFX
    Réponses: 15
    Dernier message: 02/11/2009, 01h37
  3. Afficher une Image à partir d'un Byte[]
    Par OminiuS dans le forum ASP.NET
    Réponses: 1
    Dernier message: 09/01/2008, 16h46
  4. Réponses: 3
    Dernier message: 20/02/2007, 14h36
  5. Réponses: 3
    Dernier message: 12/06/2002, 19h03

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