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 :

Codage de l'information (Image négatif) [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Codage de l'information (Image négatif)
    Bonjour à tous

    Je suis nouveau ici, et je suis un élève de Terminale S spé ISN.
    Je suis en train de programmer, en langage Python, de façon à rendre une image négative, c'est-à-dire que les couleurs de chaque octets soient négatif (blanc => noir, etc...)
    L'image doit ressembler à ce genre de couleurs : http://totographe.free.fr/public/tut...f/negatif3.jpg

    Je possède 2 fichiers, 04 (image bmp de base), et 04_negatif (image bmp à rendre négatif).
    En codage, je dispose uniquement des fonctions:
    -Open, Close, Seek, Read, Write (pour le traitement d'un fichier)
    -Les fonctions Unpack pour convertir un binaire en décimal, et inversement avec Pack.
    -Les bases comme la boucle For / While

    Le but du jeu est de remplacer chaque couleur en complémentaire, le calcul est : "Octet_Complémentaire" = | "Octet" - 255 |

    Mon programme actuel, pour ce but, est :

    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
     
    from struct import *
     
    fic_src = open("04.bmp","rb")
    fic_dst = open("04_negatif.bmp","wb")
    for i in range(55, 1488057): #Pour i allant du 55ème octet (début codage image) au 1488056ème octet (fin codage image).
        fic_src.seek(i) #Je cherche le ième octet du fichier 04.bmp.
        octet_lu = fic_src.read(i) #J'affecte cette représentation binaire à "octet_lu" pour plus de facilité.
        a = unpack('B',octet_lu) #J'affecte à "a" la valeur décimale de "octet_lu"
        nouvelle_valeur_decimal = a [0]-255 #Calcul pour obtenir la valeur décimale complémentaire : comp = |coul-255|
        if nouvelle_valeur_decimal < 0 :
            nouvelle_valeur_decimal = - nouvelle_valeur_decimal #Règle de la valeur absolue
        nouvelle_valeur = pack('B',nouvelle_valeur_decimal)#Nouvelle valeur binaire
        fic_dst.write(nouvelle_valeur)#Je l'écris dans le nouveau fichier, afin de le rendre négatif. (avec la boucle, on aura modifier chaque octet du traitement de l'image)
    fic_src.close
    fic_dst.close #Je ferme les deux fichiers.
    Mais je rencontre un problème dont j'ignore : "unpack requires a bytes object of length 1" et la ligne d'erreur est : "a = unpack('B',octet_lu)

    Cela fait depuis longtemps que j'essaye de trouver un programme cohérent...
    C'est pour cela que je fais appel à votre aide

    Je vous remercie pour votre lecture !

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    pour répondre uniquement à la question posée (exception levée : pourquoi ?), c'est le 'i' de la ligne 8 qui provoque tout ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    octet_lu = fic_src.read(i)
    tu lis i octets, et non pas 1 seul (i étant supérieur ou égal à 55).

    A la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = unpack('B',octet_lu)
    le 'B' du format fait que, unpack, s'attend à trouver un buffer 'octet_lu' de taille 1.
    Attention : unpack renvoie toujours un tuple ! Une affectation directe à 'a' va poser d'autres problèmes.

    Et sinon, il y a beaucoup à redire sur ton code ...
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Tout d'abord, merci pour votre réponse rapide !

    Je vois, merci d'avoir pu éclairer mon incohérence par rapport à la ligne 8 !

    "Et sinon, il y a beaucoup à redire sur ton code ..."
    Et en effet, malgré cette correction, je reste coincé dans le même problème.

    Mais, est-ce que, d'après vous, ce code a besoin d'autres fonctions?

  4. #4
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Quelques questions et précisions

    1. valeur absolue ? fonction abs() !

    2. pour se placer au n-ième octet on fait un déplacement depuis le début du fichier de n-1 octets

    3. les images bmp ont deux entêtes (fichier et image) dont la somme des tailles vaut 54. Mais es-tu sur de ne pas avoir aussi une palette de couleurs après les entêtes (oui, même pour du N&B, il peut y en avoir !) ? Travailles-tu à partir de la définition du format BMP ou à partir d'indications fournies par ton professeur ?

    4. quelles sont les dimensions de ton image (lignes et colonnes) ?

    5. à aucun moment tu n'écris les entêtes de ton fichier résultat
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    1- Je ne connaissais pas la fonction, merci de me l'avoir appris

    2- J'avais pris cela en compte, j'avais mis "range(1488057)" pour aller jusqu'au 1488056ème octet

    3- Tout d'abord, en effet, pour traiter l'image, j'avais "sauter" l'entête du fichier et de l'image, et je me suis servi de FreeHexEditor pour pouvoir vérifier l'octet qui initie le traitement de l'image. Je confirme bien qu'il s'agit à partir du 55ème octet, c'est à dire à l'adresse "00000036". Donc logiquement, il n'y a pas de palette de couleur, puisque à l'adresse "00000035" c'est la fin de l'entête de l'image.
    Un peu les deux, on m'a fait travaillé le format BMP dans un premier TP pour comprendre la structure d'une image, mais pour ce deuxième TP, on m'a donné des indications particuliers (les fonctions que j'ai donné sur le sujet).

    4- Les dimensions sont : 800 x 620, donc un total de 496 000 pixels. Comme un pixel vaut 3 octet, on a donc 3*496 000 octets pour le traitement de l'image, ce qui donne 1,488,000 octets pour le traitement de l'image.

    5- Je n'ai jamais étudier l'écriture des entêtes d'un fichier en cours... donc je ne connais ni les fonctions, ni comment les placer

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 602
    Points
    56 602
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    tel quel tu pourrais faire fonctionner ton programme sur le fichier 04.bmp, mais il n'est pas généralisable à d'autres images bmp. Que se passe-t-il si ton image ne fait plus que 640x400, si le pixel n'est plus codé sur 3 octets, s'il y a une palette, si si... ?

    Toutes ces informations sont inscrites dans les entêtes et peuvent être récupérées mais il faut se donner la peine de fouiller dans les spécifications du format BMP (faciles à trouver sur le net). On y apprend par exemple que les deux premiers octets représentent la signature (=42 4D pour un bitmap Windows, suivi de la taille du fichier sur 4 octets, suivi de...

    Sans prendre en compte nécessairement tous les cas possibles, ce serait bien que ton programme puisse fonctionner sur un maximum de bmp. Tu peux faire des tests sur de toutes petites images de quelques pixels (4-5 pixels de côté) et voir comment ça marche avec ton éditeur hexa.

    Note: le point 5 de plxpy, il faut recopier les entêtes (a priori tels quels) dans le fichier de destination.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bonjour !

    Merci pour votre réponse rapide.

    En effet, je suis au courant sur le fait que mon programme n'est pas applicable sur tous les fichiers bmp, mais, pour l'instant, je cherche juste à rendre négatif un seul fichier bmp, je n'ai pas besoin d'aller plus loin

    Ensuite, on a déjà étudier un TP pour comprendre les représentations binaires et décimales des images, notamment le "42 4d" pour le format BMP, la taille en octet, la compression, la profondeur etc... Donc, ces informations sont déjà acquises, il n'y a pas de souci à se faire là dessus

    (Correction des éléments "i" => "1" et la fonction abs() ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from struct import *
     
    fic_src = open("04.bmp","rb")
    fic_dst = open("04_negatif.bmp","wb")
    for i in range(55, 1488057): #Pour i allant du 55ème octet (début codage image) au 1488056ème octet (fin codage image).
        fic_src.seek(i) #Je cherche le ième octet du fichier 04.bmp.
        octet_lu = fic_src.read(1) #J'affecte cette représentation binaire à "octet_lu" pour plus de facilité.
        a = unpack('B',octet_lu) #J'affecte à "a" la valeur décimale de "octet_lu"
        nouvelle_valeur_decimal = abs(a [0]-255) #Calcul pour obtenir la valeur décimale complémentaire : comp = |coul-255|
        nouvelle_valeur = pack('B',nouvelle_valeur_decimal)#Nouvelle valeur binaire
        fic_dst.write(nouvelle_valeur)#Je l'écris dans le nouveau fichier, afin de le rendre négatif. (avec la boucle, on aura modifier chaque octet du traitement de l'image)
    fic_src.close
    fic_dst.close #Je ferme les deux fichiers.
    Mais j'ai toujours le même message d'erreur dans la ligne 9...
    Puis enfin, que voulez-vous dire par "recopier les entêtes"? Je suis qu'un novice pour l'instant, désolé

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 602
    Points
    56 602
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par KingKyser Voir le message
    Mais j'ai toujours le même message d'erreur dans la ligne 9...
    le même que précédemment ?
    Citation Envoyé par KingKyser Voir le message
    "unpack requires a bytes object of length 1" et la ligne d'erreur est : "a = unpack('B',octet_lu)
    Essaie de déboguer dans la console, en affichant les valeurs de tes variables (ou faire avancer ton programme pas à pas si tu peux)

    que voulez-vous dire par "recopier les entêtes"? Je suis qu'un novice pour l'instant, désolé
    oui, les 55 premiers octets du fichier. On doit les retrouver dans le fichier de destination.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par f-leb Voir le message
    oui, les 55 premiers octets du fichier. On doit les retrouver dans le fichier de destination.
    Si j'ajoute entre les lignes 5 et 6, c'est-à-dire avant le traitement de l'image, pour les entêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range (54):
        fic_src.seek(i)
        fic_dst.write(fic_src.read(1))
    Cela devrait marcher? (j'ai testé le programme, toujours le même erreur) => "unpack requires a bytes object of length 1" et la ligne d'erreur est : "a = unpack('B',octet_lu)"


    Ensuite, concernant le débogage, j'ai essayé via IDLE, mais comme je n'ai pas utilisé la commande "print()", on ne m'affiche rien étape par étape, ça commence à devenir lourd ce genre d'erreur incompréhensible

  10. #10
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Ce serait bien de mettre la totalité du message d'erreur et pas seulement la fin.

    Mais, sinon, après avoir lu 1 octet, si le unpack plante, je ne vois qu'une chose : tu as atteint la fin du fichier et 'octet_lu' est vide.

    Quelle est la taille de ton fichier ?
    Es-tu sur que ton image est en mode RGB ? Pour une image N&B, 3 octets par pixel, c'est luxueux mais inutile.

    Mets la ligne 9 dans un bloc try ... except

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try:
        a = unpack('B',octet_lu)
    except:
        print("taille buffer", len(octet_lu))
        print("offset", i)
        raise
    Et pourquoi ne pas nous mettre, en fichier attaché, le début (les premiers 2Ko) de l'image ? On pourrait aller jeter un oeil dans les entêtes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> src = open("04.bmp", "rb")
    >>> dst = open("debut_04.bmp", "wb")
    >>> dst.write(src.read(2048))
    >>> src.close()
    >>> dst.close()
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  11. #11
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 602
    Points
    56 602
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Citation Envoyé par KingKyser Voir le message
    Ensuite, concernant le débogage, j'ai essayé via IDLE...
    Déboguer avec IDLE

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Ce serait bien de mettre la totalité du message d'erreur et pas seulement la fin.

    Mais, sinon, après avoir lu 1 octet, si le unpack plante, je ne vois qu'une chose : tu as atteint la fin du fichier et 'octet_lu' est vide.

    Quelle est la taille de ton fichier ?
    Es-tu sur que ton image est en mode RGB ? Pour une image N&B, 3 octets par pixel, c'est luxueux mais inutile.

    Mets la ligne 9 dans un bloc try ... except

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try:
        a = unpack('B',octet_lu)
    except:
        print("taille buffer", len(octet_lu))
        print("offset", i)
        raise
    Et pourquoi ne pas nous mettre, en fichier attaché, le début (les premiers 2Ko) de l'image ? On pourrait aller jeter un oeil dans les entêtes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> src = open("04.bmp", "rb")
    >>> dst = open("debut_04.bmp", "wb")
    >>> dst.write(src.read(2048))
    >>> src.close()
    >>> dst.close()


    "tu as atteint la fin du fichier et 'octet_lu' est vide"
    Merci ! J'ai vérifié via FreeHexEditor, le dernier octet est nul, et en hexadécimal, j'ai 0x00.
    J'ai donc remplacé "range(1488057)" par "range(1488056)" et je n'ai plus le message d'erreur

    (L'image vaut 1.41 mo, couleurs RGB)

    Par contre, le fichier bmp "04_negatif" est vide...
    J'ai testé les deux modifications que vous avez proposé, le problème reste présent : fichier bmp vide, mais l'erreur via Python Shell n'est plus présent.
    Puis concernant le débogage, je te remercie pour ce lien, j'ai pu en apprendre des choses

  13. #13
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 602
    Points
    56 602
    Billets dans le blog
    40
    Par défaut
    fichier mal clos ?

    Dans ton code

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fic_src.close()
    fic_dst.close()

    avec les parenthèses.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par f-leb Voir le message
    fichier mal clos ?

    Dans ton code

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fic_src.close()
    fic_dst.close()

    avec les parenthèses.
    Parfait ! Programme fonctionnel, résultat satisfaisant, je vous remercie, j'ai pu apprendre beaucoup de choses concernant ce langage Python


    Encore une fois merci à tous d'avoir eu la gentillesse de pouvoir participer à ce sujet

  15. #15
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 602
    Points
    56 602
    Billets dans le blog
    40
    Par défaut
    , reste à peaufiner tout ça mais tu as le principe.

    Pense à cliquer sur le bouton en bas de page

    Bonne continuation

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par f-leb Voir le message
    , reste à peaufiner tout ça mais tu as le principe.

    Pense à cliquer sur le bouton en bas de page

    Bonne continuation
    Programme final, pour rendre les choses claires :

    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
    from struct import *
     
    #Ouverture des deux fichiers. (Fichiers initial et de destination)
    fic_src = open("04.bmp","rb")
    fic_dst = open("04_negatif.bmp","wb")
     
    #Traitement des entêtes
    for i in range (55): #Pour i allant du 1er octet au 54ème octet
        fic_src.seek(i) #Je cherche le ième octet du fichier 04.bmp.
        fic_dst.write(fic_src.read(1))#Je l'écris dans le nouveau fichier 04_negatif.bmp.
     
    #Traitement du corps de l'image    
    for i in range(55, 1488056): #Pour i allant du 55ème octet (début codage image) au 1488055ème octet (fin codage image).
        fic_src.seek(i) #Je cherche le ième octet du fichier 04.bmp.
        octet_lu = fic_src.read(1) #J'affecte cette représentation binaire à "octet_lu".
        a = unpack('B',octet_lu) #J'affecte à "a" la valeur décimale de "octet_lu"
        nouvelle_valeur_decimal = abs(a [0]-255) #Calcul pour obtenir la valeur décimale complémentaire : comp = |coul-255|
        nouvelle_valeur = pack('B',nouvelle_valeur_decimal)#Nouvelle valeur binaire
        fic_dst.write(nouvelle_valeur)#Je l'écris dans le nouveau fichier, afin de le rendre négatif.
     
    #Fermeture des deux fichiers bmp. (Fichiers initial et de destination)
    fic_src.close()
    fic_dst.close()
    Problème résolu

  17. #17
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Désolé mais tes valeurs dans les range sont encore incorrectes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       offsets  |0             53 | 54                          1488053 | 1488054
                +=================+=====================================+
      fichier   |    entetes      |             pixels RGB              | FIN DE FICHIER
                +=================+=====================================+
                |                 |                                     |
       tailles  <------ 54 -------><------------ 1488000 --------------->

    ps : quelle est la taille de ton fichier image à l'octet près ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Désolé mais tes valeurs dans les range sont encore incorrectes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       offsets  |0             53 | 54                          1488053 | 1488054
                +=================+=====================================+
      fichier   |    entetes      |             pixels RGB              | FIN DE FICHIER
                +=================+=====================================+
                |                 |                                     |
       tailles  <------ 54 -------><------------ 1488000 --------------->

    ps : quelle est la taille de ton fichier image à l'octet près ?
    L'image vaut exactement 1488056 octets, mais le dernier octet occupant la fin du fichier est vide, et il est à l'origine de l'erreur qui m’empêchait de terminer le programme.
    Donc j'arrête la boucle jusqu'au 1488055ème octet, et cela a marché.

    Sinon petite confusion : comment devrais-je modifier le programme lorsque je devrais mettre la profondeur en 8 bpp, donc avec une palette de couleur? Pour faire simple, comment peut-on partir d'une image de couleur 24 bits et produire un niveau de gris 8 bits (qui nécessite une palette de couleur) via python? Rendre l'image négatif était plus simple, car il n'y avait pas a modifier la profondeur et la palette de couleur n'était pas nécessaire.

  19. #19
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Je ne comprends pas la taille du fichier, au vu des infos que tu as fournies.

    A défaut de poster le début du fichier avec les entêtes, peux-tu poster ce qui est affiché par ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from struct import unpack
    f = open('04.bmp', 'rb')
    print(unpack("=2sI2HI", f.read(14)))
    print(unpack("3I2H6I", f.read(40)))
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  20. #20
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 602
    Points
    56 602
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par KingKyser Voir le message
    Sinon petite confusion : comment devrais-je modifier le programme lorsque je devrais mettre la profondeur en 8 bpp, donc avec une palette de couleur? Pour faire simple, comment peut-on partir d'une image de couleur 24 bits et produire un niveau de gris 8 bits (qui nécessite une palette de couleur) via python? Rendre l'image négatif était plus simple, car il n'y avait pas a modifier la profondeur et la palette de couleur n'était pas nécessaire.
    Je ne sais pas s'il y a forcément besoin d'une palette mais le principe est de calculer le niveau de gris avec les composantes RVB (faire une recherche sur le net), par exemple avec la formule :
    Luminance = 0,299 × Rouge + 0,587 × Vert + 0,114 × Bleu

    Après ça pourrait faire un truc (vite fait) comme :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    pixel = fic_src.read(3)
    bleu, vert, rouge = unpack("BBB", pixel)
    gris=int(0.299 * rouge + 0.587*vert+0.114*bleu)
    fic_dst.write(pack("B", gris))
    ...

    mais il faut refaire les entêtes dans le fichier de destination.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [JDK 1.6.0] Information image
    Par henri93 dans le forum Général Java
    Réponses: 8
    Dernier message: 14/08/2014, 11h45
  2. Réponses: 1
    Dernier message: 09/10/2006, 18h04
  3. Acquisition d'informations 3D à partir de séquences d'images
    Par Clad3 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 31/05/2005, 16h31
  4. Réponses: 5
    Dernier message: 18/05/2005, 14h03
  5. Image en négatif
    Par jasmar dans le forum C++Builder
    Réponses: 1
    Dernier message: 19/03/2005, 20h11

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