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 :

Convertir une Image en byte[]


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Convertir une Image en byte[]
    Bonjour,

    Je cherche une façon simple de convertir un objet Image ou BufferedImage en tableau de bits, si possible sans passer par un fichier temporaire.

    Ce doit être possible via un ByteArrayInputStream, mais comment connaître la taille pour l'initialiser ?

    Merci.

  2. #2
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Peut être regardé du côté de BufferedImage avec Raster et ça méthode getDataBuffer()

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'ai cherché dans cette voie, et tenté ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((DataBufferByte) newImage.getRaster().getDataBuffer()).getData()
    L'exception suivante est générée :
    java.lang.ClassCastException: java.awt.image.DataBufferInt cannot be cast to java.awt.image.DataBufferByte
    Et bien sur un DataBufferInt.getData() renvoie un int[] et pas un byte[].

  4. #4
    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 : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    La classe BufferedImage possède la méthode "getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize)".
    Ce sont des int, et pas des byte, pour avoir la méthode la plus générique possible. Selon le type de ton image, c'est à toi de savoir ou se trouvent les données dans ton entier : 8, 16, 24 ou 32 bits, ou encore une config perso.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par 84mickael Voir le message
    Ce doit être possible via un ByteArrayInputStream, mais comment connaître la taille pour l'initialiser ?
    Un ByteArrayOutputStream plutôt...
    Pour la taille cela n'a pas vraiment d'importance car elle sera adaptée selon les besoins. Mais si tu as la taille exacte ou une approximation, tu peux éviter des redimensionnements inutiles...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public static byte[] getBytes(BufferedImage img) throws IOException {
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
    		try {
    			ImageIO.write(img, "png", baos);
    		} finally {
    			baos.close();
    		}
    		return baos.toByteArray();
    	}
    a++

  6. #6
    Invité
    Invité(e)
    Par défaut
    Entre temps j'avais trouvé une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    JPEGCodec.createJPEGEncoder(baos).encode(newImage);
    byte[] b = baos.toByteArray();
    Alors qu'est-ce qui est le mieux entre ces deux instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ImageIO.write(newImage, "jpeg", baos);
    JPEGCodec.createJPEGEncoder(baos).encode(newImage);
    En tout cas merci pour ces précisions.

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    JPEGCodec ne fait pas partie de l'API Java standard... A éviter donc !


    a++

  8. #8
    Invité
    Invité(e)
    Par défaut
    Très bien.

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

Discussions similaires

  1. convertir une image en un tableau de byte
    Par isoman dans le forum Graphisme
    Réponses: 7
    Dernier message: 30/03/2009, 10h17
  2. Convertir une image en byte array!
    Par zanteskuken dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/07/2008, 14h30
  3. [C#] Convertir une Image en Icon
    Par Piolet dans le forum Windows Forms
    Réponses: 4
    Dernier message: 25/08/2004, 13h41
  4. [C#] Comment convertir une image bmp en jpg !!!
    Par vandeyy dans le forum Windows Forms
    Réponses: 5
    Dernier message: 13/07/2004, 20h37

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