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

JavaFX Discussion :

Afficher une image à partir d'un tableau de byte


Sujet :

JavaFX

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Points : 29
    Points
    29
    Par défaut Afficher une image à partir d'un tableau de byte
    Bonjour à tous,

    je n'arrive pas à trouver comment on peut convertir un tableau de byte (que j'ai récupéré via un web service fait maison) en Image pour la même en background d'un Node.

    Je sais faire en Java, mais en JavaFx je ne sais afficher une image qu'en donnant son URL...

    Merci d'avance à ceux ou celles que ça va inspirer ^^

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var image : Image = Image.fromBufferedImage(ImageIO.read(new ByteArrayInputStream(bytes)));
    devrait marcher...

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 838
    Points : 22 846
    Points
    22 846
    Billets dans le blog
    51
    Par défaut
    Sinon la methode habituelle Swing, un JPanel/JComponent modifie pour afficher la BufferedImage ainsi chargee par ImageIO, double d'un SwingComponent.wrap(). Faire des recherches sur le forum AWT/Swing sur la maniere de proceder.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Points : 29
    Points
    29
    Par défaut
    Ok, merci pour vos deux réponses

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par jburet Voir le message
    var image : Image = Image.fromBufferedImage(ImageIO.read(new ByteArrayInputStream(bytes)));

    devrait marcher...
    Hmm j'essaie de faire comme ça, mais il ne manque pas quelque chose?
    Comment lire le tableau correctement si à aucun moment je donne des informations sur le format de l'image source?

    J'ai testé ce bout de code. Ca ne marche pas, ça me retourne une image vide. Mon tableau de bytes est bien rempli mais la conversion échoue. C'est un .png que j'ai converti en byte[], voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public byte[] image2ByteArray() {
       BufferedImage image = ImageIO.read(new URL("chemin_vers_mon_image\\image.png"));
     
       WritableRaster raster = image.getRaster();
       DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
     
       return buffer.getData();
    }

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Chez moi ce code fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var i2 = Image.fromBufferedImage(ImageIO.read(new FileInputStream("chemin image.png")));
    Le format de l'image source est automatiquement déduit du tableau de bytes.
    Ou si tu préfères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var i2 = Image.fromBufferedImage(ImageIO.read(new URL("http://www.brillien.org/media/img/java.png")));

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 838
    Points : 22 846
    Points
    22 846
    Billets dans le blog
    51
    Par défaut
    Mais justement, que contient ton tableau de byte ?
    • des données compressées sous un format courant (PNG, JPEG, etc...) ? Ici le format est déterminé en fonction du magic number et du contenu du flux exactement comme quand on ouvre un fichier (généralement l'extension d'un fichier n'est pas une garantie en soit quant à son format interne).
    • juste des couleurs correspondant à des pixels ? Il faut créer une BuffereredImage et dessiner dedans pixel à pixel ou via les méthodes setRBG().
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Points : 29
    Points
    29
    Par défaut
    Je me doutais bien que mon problème venait de la création du tableau de byte. Comme on utilise un ByteArrayInputStream pour lire le tableau, j'me suis dis qu'il fallait utiliser quelque chose du genre ByteArrayOutputStream pour le créer, d'où la modification suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public byte[] image2ByteArray() {
       BufferedImage image = ImageIO.read(new URL("chemin_vers_mon_image\\image.png"));
     
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
       ImageIO.write(image, "png", baos);
       boas.flush();
     
       return baos.toByteArray();
    }
    Et ça marche

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 838
    Points : 22 846
    Points
    22 846
    Billets dans le blog
    51
    Par défaut
    Hum... c'est pas un peu inutile comme procédure ?
    Dans ce cas autant directement utiliser Image sans passer par BufferedImage, non ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  10. #10
    Membre averti

    Profil pro
    Inscrit en
    Février 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 284
    Points : 409
    Points
    409
    Par défaut
    Salut Fr3nchK1ss,

    J'utilise pas mal javaFX pour l'affichage d'image (applis de caméra industrielles) et je te donne quelques retours d'expérience.
    Pour ce qui est de l'affichage la methode Image.fromBuffferedImage consomme pas mal de ressources et de plus provoque une fuite de mémoire en cas d'utlisation intensive ( 30 fois par seconde par exemple ). Un JPanel wrappé en SwingComponent fonctionne mieux, tu peux appelé repaint() du Jpanel sans soucis d'un thread externe.
    De plus our la manipulation des données utillise de préference l'api nio avec les byteBuffer, attention à appeler rewind() avant copie.

    Salut.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Points : 29
    Points
    29
    Par défaut
    Merci galien pour tes conseils. Je prends note. Pour l'instant j'essaie de tester un peu tous les composants pour savoir ce que JavaFX a dans le ventre. Parce que vu l'état semi-beta qui en ressort je préfère faire un peu le tour du propriétaire avant de ma lancer dans un gros projet coûteux

    Sinon bouye, comment tu ferais pour te passer de la BufferedImage?

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 838
    Points : 22 846
    Points
    22 846
    Billets dans le blog
    51
    Par défaut
    Oh, non c'est juste que ta problematique initiale etait de lire un byte[] mais dans l'exemple poste apres tu utilisais un fichier sur une URL et non plus des donnees dans un tableau, or comme Image permet justement de charger des URLs...

    je n'arrive pas à trouver comment on peut convertir un tableau de byte (que j'ai récupéré via un web service fait maison) en Image pour la même en background d'un Node.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedImage image = ImageIO.read(new URL("chemin_vers_mon_image\\image.png"));
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Points : 29
    Points
    29
    Par défaut
    Oula j'ai du tous vous embrouiller en mettant ma fonction de conversion Image -> byte[]. Celle là elle est sur mon serveur, c'est celle qui met à disposition le tableau de byte via un web service pour mon client javaFX.
    Ma question initiale était bien la lecture de ce tableau, et j'ai eu ma réponse. Mais la lecture du tableau échouait car il n'était pas construit correctement. C'est pour ça que j'ai décidé de poster ma fonction remaniée, au cas où quelqu'un voudrait avoir la solution complète: Image -> byte[] -> Image

    Voili voila, désolé pour la confusion.

  14. #14
    Membre averti

    Profil pro
    Inscrit en
    Février 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 284
    Points : 409
    Points
    409
    Par défaut
    bye[]->image[]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    bi = new BufferedImage(camWidth, camHeight, BufferedImage.TYPE_BYTE_GRAY);
     
    public function upDateBuffer(buf: ByteBuffer) {
            var dbb = bi.getRaster().getDataBuffer() as DataBufferByte;
            buf.rewind();
            buf.get(dbb.getData());
    }
    voila il faut connaitre maintenant ton format de byte[] si c'est du RAW ou si c encodé dans un format d'image, dans ce cas il y a la le package imageio ou JAI

  15. #15
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 4
    Points
    4
    Par défaut moi j'ai un tableau de type byte qui contient une image
    moi j'ai un tableau de type byte qui contient une image et je veux l'afficher sur Jpanel comment faire???? et merci

  16. #16
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 838
    Points : 22 846
    Points
    22 846
    Billets dans le blog
    51
    Par défaut
    Comme c'est une question plutot courante, le plus rapide pour avoir une reponse est de faire une recherche sur ImagePanel dans le forum "Interfaces Graphiques en Java" et aller lire la Swing. Ce n'est pas trop une question JavaFX.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Afficher une image à partir d'un tableau de pixels
    Par hajerboug dans le forum NetBeans
    Réponses: 0
    Dernier message: 02/04/2012, 22h51
  2. 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, 14h59
  3. Afficher une image à partir d'un tableau
    Par cadavor dans le forum C++
    Réponses: 6
    Dernier message: 23/05/2008, 14h25
  4. Afficher une image à partir d'un tableau de char
    Par Beavis dans le forum Débuter
    Réponses: 7
    Dernier message: 12/02/2008, 17h01
  5. Afficher une image stockée dans un tableau de bytes
    Par ValyGator dans le forum Windows
    Réponses: 2
    Dernier message: 07/01/2007, 23h52

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