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

Entrée/Sortie Java Discussion :

reconstitution d'une image a partir d'un tableau de bytes


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut reconstitution d'une image a partir d'un tableau de bytes
    bonjour !

    je cherche a reconstituer une image a partir d'un tableau de bytes (comme le titre l'indique)

    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
     
     final ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
     
     
            	ZipEntry ze;
            	byte buf[];
    	        // Parcourt tous les fichiers
    	        while (null != (ze = zis.getNextEntry())) {
     
    	        	buf = new byte[(int)ze.getSize()];
     
    	    		int off = 0;			// Début de l'écriture
    	    		int len = buf.length;	// Nombre d'élément à écrire
    	    		int read = 0;			// Nombre d'élément lu
     
    	    		while ( (len>0) && (read = zis.read(buf, off, len))>0 ) {
    	    			off += read;
    	    			len -= read;
    	    		}
     
            }
    ce code me permet de stocké mon image (contenue dans un .zip appelé "file") dans un tableau de bytes. Ce code fonctionne trés bien pour un fichier texte que j'arrive à lire et à afficher pafaitement ensuite.


    je récupere mon image a partir du byte[], comme celà :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //methode utilisant les librairie Android  
    (android.graphics.Bitmap & android.graphics.BitmapFactory)
     
            Bitmap bitmap = BitmapFactory.decodeByteArray(buf,0,buf.length);
    ou bien comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            InputStream is = new ByteArrayInputStream(buf);
    mai pour les deux methode j'ai le meme resultat, mon image (que jaffiche, c'est plus pratique) est penchée vers la droite d'environ 50°... (les pixel qui manquent sont alor répétés de l'autre coté horizontalement (je m'explique bien?))

    je pense que ceci est due a la decompression et a l'écriture(ou la lecture) du byte[] qui est mal faite car une image ouverte directement d'un fichier s'affiche normalement...

    pouvez vous m'aider?
    je vou remerci d'avance pour toute aide que vous pourrez m'apporter.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut ...
    donnée complémentaire: on peut voir (ou "ne pas voir"^^au choix) une ligne (fine d'un pixel) noire, horizontale, dans le coin inferieure droit...




    il doit manquer quelque byte dans mon tableau car il mank klk pixels ...
    (c'est ma conclusion... dite moi si je me trompe...)

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Je pense plutôt au "scansize" donné lors de la construction de l'image. Ceci représente la largeur de l'image.
    Si tu donnes une valeur trop petite, la fin d'une ligne de l'image se retrouve en début de ligne suivante.
    Comment construis-tu ton image ? Donne le code complet.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut :(
    je construit mon image en utilisant la methode .read(buf, off, len) de ZipInutStream (mon image est un fichier contnue dans une archive)

    je montre ce procédé dans le premier bou de code que je donne et rien du reste de mon code ne se rapporte a la lecture de l'image.


    je converti directement mon fichier .jpg en byte[], je ne defini donc aucun "scansize" ... peut etre est-ce un probleme... comment definit-on cette valeur habituellement ?

    ps: merci de t'interresser a mon souci

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Ouhla, je ne comprends plus ce que tu veux.
    Au début, tu demandes comment reconstruire une image à partir d'un tableau de bytes.
    Et maintenant, tu souhaites simplement placer un tableau de byte dans un Zip ?

    Pour le "scansize", c'est à la construction de l'objet représentant l'image. Et tu n'as pas donné le code où tu construis ton objet image (BufferedImage j'imagine ?).

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par guian Voir le message
    je construit mon image en utilisant la methode .read(buf, off, len) de ZipInutStream (mon image est un fichier contnue dans une archive)

    je montre ce procédé dans le premier bou de code que je donne et rien du reste de mon code ne se rapporte a la lecture de l'image.


    je converti directement mon fichier .jpg en byte[], je ne defini donc aucun "scansize" ... peut etre est-ce un probleme... comment definit-on cette valeur habituellement ?

    ps: merci de t'interresser a mon souci
    pardon je m'exprime peut etre mal sur ce coup la :
    je STOCKE mon image dans mon tableau de byte[] utilisant la methode .read(buf, off, len) de ZipInutStream

    je reconstruit avec BitmapFactory.decodeByteArray();
    me conseillerai tu une autre methode?

    je vai me renseigner sur BufferedImage que pour l'instant je n'utilise pas.

    mais je te rassure tuavai bien compris au debut ^^

    edit: en effet j'utilise une class de la librairie Android :
    http://code.google.com/android/reference/android/graphics/BitmapFactory.html#decodeByteArray(byte[],%20int,%20int)

    peut etre devrais je essayer ta methode, mais comment construit tu une BufferedImage a partir d'un byte[] ?

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Ah ok

    Normalement, la librairie Android devrait fonctionner correctement.
    Pour faire un test, écrit tout le tableau de byte dans un fichier sur disque. Puis utilise ton viewer d'image préféré pour vérifier si l'image s'ouvre correctement.

    Comment le tableau de byte arrive dans le Zip ? Si c'est ton code à toi, tu peux le poster stp ?

    Sinon, au lieu de stocker les données dans un tableau, essaie la méthode "decodeStream(InputStream is)". Ton code sera plus clair et plus court ;-)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut
    Normalement, la librairie Android devrait fonctionner correctement.
    Pour faire un test, écrit tout le tableau de byte dans un fichier sur disque. Puis utilise ton viewer d'image préféré pour vérifier si l'image s'ouvre correctement.
    je vai tester ça et je te redi comment s'affiche l'image

    Comment le tableau de byte arrive dans le Zip ? Si c'est ton code à toi, tu peux le poster stp ?
    le .zip contient des fichier .jpg que je recupere dans mon tableau de bit
    (l'image est bien droite et n'a aucun probleme)

    Sinon, au lieu de stocker les données dans un tableau, essaie la méthode "decodeStream(InputStream is)". Ton code sera plus clair et plus court ;-)
    Stocker dans un tableau de bit me permet une utilisation ulterieur de mon image, puis-je conserver un InputStream dans une variable globale de la meme maniere?

  9. #9
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par guian Voir le message
    puis-je conserver un InputStream dans une variable globale de la meme maniere?
    Non, il faut effectivement un tableau de byte.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut ok
    ok on va donc conserver ce tableau de byte, j'ai d'ailleur la preuve que l'extraction a partir de l'archive se passe bien :

    ce bout de code :
    ("/adresse/tmp.jpg" étant l'adresse d'un fichier existant, vide, renommé tmp.jpg)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	String str =ze.getName();
     
    	File tmp = new File("/adresse/tmp.jpg");
    	if(tmp.exists()) {
    		FileOutputStream toto = new FileOutputStream(tmp);
    		toto.write(buf);
    	}
    fonctionne bien, et me permet de recupérer mon image dans son integralité sans probleme...

    c'est donc du coté de BitmapFactory.decodeByteArray() qu'il y a un probleme ?

    est ce que je m'en sert mal ou, (ce qui est moin probable) y a t'il un vrai bug dans cette methode?

  11. #11
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    C'est peut-être un format mal interprété. Tente de mettre une image au format BMP, PNG puis Gif.

    Sinon, la dernière idée qui me vient est d'utiliser javax.ImageIO#read.
    Pour convertir ton tableau de byte en InputStream, tu peux utiliser ByteArrayInputStream.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut
    malheureusement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    InputStream is = new ByteArrayInputStream(buf);
     
    bitmap = BitmapFactory.decodeStream(is);
    me donne le meme resultat ...

    comment fonction BufferedImage ? puis je recupérer un tableau de byte avec?

  13. #13
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par guian Voir le message
    comment fonction BufferedImage ? puis je recupérer un tableau de byte avec?
    C'est le contraire. Tu construis un BufferedImage via javax.ImageIO en lui donnant ton tableau de byte. Tu as regardé les liens vers la javadoc que je t'ai donné ?

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut
    ok j'ai vu (en effet je n'était pas aller sur la page de ImageIO ),

    donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    inputStream is = new bteArrayInputStream(buf);
     
    BufferedImage toto = ImageIO.read(is);
    je teste ça tt de suite...

    arf...

    import java.awt.image.BufferedImage;

    me donne : java.awt.image cannot be resolved.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut
    j'ai beau retourner le probleme dans tout les sens, j'en conclu que BitmapFactory.decode*() de la librairie android est buggé

    me trompe-je ?

    avez vous une autre idée?

    je vais soumettre le probleme a un forum plus spécialisé android en parallèle, voir ce qu'ils en disent...

  16. #16
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Tu utilises quelle version de JVM ? La micro edition ?

  17. #17
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Bonjour,

    Le plus simple est d'écrire un programme de test qui va comparer les valeurs (stream de byte) retournées par la lecture "directe" du fichier source et les valeurs retournées par le fichier"zippé".

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut
    dsl de vous avoir pris de votre temp pour un probleme qui n'avait finalement rien à voir...

    je m'explique :

    j'affiche mon image en l'utilisant comme une texture OpenGL. le vrai probleme c'est que mon image n'a pas une taille = a une puissance de deux...

    largeur de mon image = 1023

    opengl veut l'afficher comme une image de 1024 de largeur => decalage d'un pixel a chaque ligne => image "penchée"

    je recherche maintenant une méthode pour utiliser n'importe kel image peut importe sa taille pour une texture OpenGL si vous savez ou je peu trouver cela j'en serai ravi, mai on peut considérer se probleme comme resolu puisque le réel probleme n'est pas du tout ce que je vou ai décrit

    toute mes excuse, et merci pour votre aide

    a+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/11/2008, 15h36
  2. Récupérer une image JPEG à partir d'une vidéo
    Par kurul1 dans le forum C++Builder
    Réponses: 8
    Dernier message: 09/08/2006, 10h51
  3. [Conception] Construire une image à partir d'un tableau
    Par jacques_henry dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/02/2006, 14h53
  4. Réponses: 2
    Dernier message: 06/02/2006, 09h12
  5. [Image] Comment créer une image à partir d'un fichier
    Par mereyj dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 01/07/2005, 21h48

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