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

Graphisme Java Discussion :

v4l4j : Enregistrer une image


Sujet :

Graphisme Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de flotho
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Novembre 2006
    Messages : 156
    Par défaut v4l4j : Enregistrer une image
    Bonjour à tous,

    J'espère poster au bon endroit,

    Je travaille avec l'excellente librairie http://code.google.com/p/v4l4j/ pour faire des captures sur mes webcams.
    Le principe est de capturer un ByteBuffer : http://code.google.com/p/v4l4j/wiki/Examples
    bb = fg.getFrame();

    Mon souci est pour enregistrer ce bytebuffer en image. Au début je manipulait de simple fileoutput/inputstream mais le format n'était pas reconnu.

    Après recherche, j'ai trouvé les ImageOutputStream et les BufferedImage. J'imagine que c'est l'outil adapté pour faire ce que je désire.

    Malheureusement, je ne sais pas comment passer le byteBuffer.array() vers le BufferedImage. EN résumé :

    Comment sauvegarder une image (.png ou .jpg) à partir d'un bytebuffer.

    En vous remerciant d'avance de vos commentaires.

  2. #2
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Salut,
    j'ai pas une idée sur v4l4j, mais si tu cherche à utiliser la classe BufferedImage, tu as à votre disposition le constrcuteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    BufferedImage(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, Hashtable<?,?> properties)
              Constructs a new BufferedImage with a specified ColorModel and Raster.
    un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int width = ...;
    int height = ...;
    byte[] rawArray = ...;
    ...
    ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
    int[] nBits = {8, 8, 8};
    int[] bOffs = {2, 1, 0};
    ColorModel colorModel = new ComponentColorModel(cs, nBits, false, false,Transparency.OPAQUE,DataBuffer.TYPE_BYTE);
    WritableRaster raster = Raster.createInterleavedRaster(new DataBufferByte(rawArray,rawArray.length),width, height, width * 3, 3,bOffs, null);
     
    BufferedImage imgReconstructed = new BufferedImage(colorModel,raster,false,null);
    Tu peux poster ta question ici et voir avec pseudocode

  3. #3
    Membre confirmé Avatar de flotho
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Novembre 2006
    Messages : 156
    Par défaut
    Citation Envoyé par slim_java Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BufferedImage(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, Hashtable<?,?> properties)
              Constructs a new BufferedImage with a specified ColorModel and Raster.
    Il me semblait que le constructeur pouvait être plus simple
    un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int width = ...;
    int height = ...;
    byte[] rawArray = ...;
    ...
    ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
    int[] nBits = {8, 8, 8};
    int[] bOffs = {2, 1, 0};
    ColorModel colorModel = new ComponentColorModel(cs, nBits, false, false,Transparency.OPAQUE,DataBuffer.TYPE_BYTE);
    WritableRaster raster = Raster.createInterleavedRaster(new DataBufferByte(rawArray,rawArray.length),width, height, width * 3, 3,bOffs, null);
     
    BufferedImage imgReconstructed = new BufferedImage(colorModel,raster,false,null);
    Je veux bien comprendre l'utilité d'un raster.
    C'est une matrice qui va recevoir les bytes. C'est bien cela?
    Tu peux poster ta question ici et voir avec pseudocode
    Merci j'ai fait cela on verra ensuite

  4. #4
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Le Raster (la trame aussi) contient les données de l'image.
    on peut le représenter comme un tableau de valeurs de pixels.
    Le Raster d'une image RGB renvoie trois valeurs, tandis que celui d'une image en niveau de gris renvoie une valeur unique.
    Je rajoute que le Raster est lui-même composé d'un DataBuffer .
    Ce dernier contient les données brutes dans un tableau. Ainsi, un DataBuffer est une enveloppe de données brutes, qui sont des tableaux de byte, short, ou int.

  5. #5
    Membre confirmé Avatar de flotho
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Novembre 2006
    Messages : 156
    Par défaut
    Toujours un grand merci du coup de pousse.

    De mon côté j'ai tenté ton code précédent. J'ai bien compris que le raster récupérait un tableau de byte.
    j'ai procédé comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FrameGrabber fg;
    ByteBuffer bb;
     
    int width = 640, height = 480, input = 0, standard = V4L4JConstants.STANDARD_PAL, channel = V4L4JConstants.STANDARD_
    ImageFormat imf =  vd.getDeviceInfo().getFormatList().getJPEGEncodableFormats().get(0);
    fg = vd.getJPEGFrameGrabber(width, height, input, channel,100, imf);
    fg.startCapture();
    bb = fg.getFrame();
    fg.stopCapture();
     
    byte[] b = new byte[bb.limit()];
    bb.get(b);
    A ce niveau j'ai bien récupéré un tableau de byte depuis mon API. Cette syntaxe est celle recommandée sur le site.

    Ensuite je mets ta partie de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
    int[] nBits = {8, 8, 8};
    int[] bOffs = {2, 1, 0};
     
    ColorModel colorModel = new ComponentColorModel(cs, nBits, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
    DataBuffer dtaBuf = new DataBufferByte(b,b.length);
    WritableRaster raster = Raster.createInterleavedRaster(dtaBuf, width, height, width * 3, 3, bOffs, null);
    Je ne passe pas cette étape. J'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Caused by: java.awt.image.RasterFormatException: Data array too small (should be 921599 )
            at sun.awt.image.ByteComponentRaster.verify(ByteComponentRaster.java:877)
            at sun.awt.image.ByteComponentRaster.<init>(ByteComponentRaster.java:184)
            at sun.awt.image.ByteInterleavedRaster.<init>(ByteInterleavedRaster.java:174)
            at sun.awt.image.ByteInterleavedRaster.<init>(ByteInterleavedRaster.java:96)
            at java.awt.image.Raster.createInterleavedRaster(Raster.java:645)
            at testdepouillement.ttmt.Webcam.start_Webcam(Webcam.java:123)
            at testdepouillement.gui.TestDepouillementView.showLancerTraitement(TestDepouillementView.java:308)
            ... 34 more
    Je sens bien que cela doit venir du format de l'image mais j'avoue que je sèche.


    Ensuite je prévoyais de finir l'enregistrement de l'image de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BufferedImage imgReconstructed = new BufferedImage(colorModel, raster, false, null);
    File destinationFile = new File("/home/florent/tmp/testWebcam.jpeg");
    ImageIO.write(imgReconstructed, "jpeg", destinationFile);
    [/CODE]

  6. #6
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Salut,
    une recherche sur google m'a donné ceci ...

    s'agit il d'un bug !!

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

Discussions similaires

  1. ENREGISTRER UNE IMAGE OU UN FICHIER .DOC
    Par manudja dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/08/2005, 13h32
  2. enregistrer une image
    Par meli0207 dans le forum MFC
    Réponses: 35
    Dernier message: 12/07/2005, 09h00
  3. [GLScene] Comment enregistrer une image au format TGA
    Par Invité dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 27/05/2005, 15h12
  4. Enregistrer une image
    Par N@sH dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 04/05/2005, 10h07
  5. enregistrer une image et un identifiant
    Par dosach dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/03/2004, 17h18

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