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

Java ME Discussion :

Image Processing : Problème avec les Inputstream du MédiaProcessor


Sujet :

Java ME

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut Image Processing : Problème avec les Inputstream du MédiaProcessor
    Bonjour!

    J'ai un souci pour faire du traitement d'images. En fait j'ai dévelopé une appli qui va chercher un nombre donné de photos dans la mémoire du téléphone et les affiche à l'écran. (enfin, c'est un peu plus compliqué que cela mais disons que en ce qui concerne le problème que j'ai, cela suffit).
    Donc, j'ai récupéré mes images du tel, et j'ai donc fait des objets Image à partir de cela.

    Je voudrais en fait que ces images apparaissent à l'écran du mobile avec un effet, par exemple monochrome.

    Après pas mal de recherches, j'ai fini par trouver qu'il est possible de faire du traitement d'images avec des classes déjà toutes prêtes comme MédiaProcessor.
    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
    MediaProcessor mp = GlobalManager.createMediaProcessor("image/png");
    // OutputStream pour stocker l'images apres traitement
    outputStream = new ByteArrayOutputStream();
    inputStream = getClass().getResourceAsStream("URL genre : /image/img.png");
    mp.setInput(inputStream, MediaProcessor.UNKNOWN);
    ImageEffectControl iec = (ImageEffectControl)mp.getControl(
                  "javax.microedition.amms.control.imageeffect.ImageEffectControl");
    iec.setPreset("monochrome");
    iec.setEnabled(true);
    mp.complete();
    processedImage = createStreamARGBImage(
                        outputStream, true, 
                        width, // width img
                        height); // height img
    Ce code a l'air pas mal comme ca, mais cependant ca me pose quand meme pas mal de problèmes :

    - premièrement, "URL genre : /image/img.png", bah ca ne m'arrange pas trop : ce que j'ai, ce sont des objets Image, et comme les images viennent directement du tel, je n'ai pas d'images .png dans le dossier res de l'appli. Donc ma première question est la suivante : comment faire la même chose avec un objet Image?

    - deuxièmement, je n'ai pas réussi à trouver de docs sur la fonction createStreamARGBImage , quand je tape createStreamARGBImage dans google, il ne trouve aucune page , d'où ma deuxième question : est ce que quelqu'un peut me renseigner sur cette fonction : sur les objets de quels types s'applique-t-elle, que fait elle, et surtout quel est le role des ses paramètres ...

    Voilà

    Merci d'avance pour tout renseigneùments sur le sujet

    Anne

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut rectification post précédent
    En fait en ce qui concerne ma question sur le createStreamARGBImage c'est une erreur de ma part. En effet, j'avais pas lu tout le code ou j'ai trouvé l'extrait de code que j'ai mis dans mon post précédent. Cette fonction est une fonction que l'auteur du code avait mise plus bas et que je n'avais pas vue.... Donc je retir ma question concernant cette fonction.... mais ma première question demeure.... si quelqu'un peut m'aider....?

  3. #3
    Membre actif
    Profil pro
    Analyste programmeur
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Finlande

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Par défaut
    Bonjour, tu peux créer des objets image de plusieurs facons, à partir d'une tableau de byte (par exemple apres une lecture d'un flux), un tableau ARGB, ou sinon une image vide :
    http://java.sun.com/javame/reference...eateImage(byte[],%20int,%20int)

    le tout est de savoir sous quelle forme tu recois tes données, par exemple si tu as sauvegardé tes images sous la forme de tableau (avec getRGB), tu peux les recréer avec un createImage

    j'espere que j'ai été clair...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut
    Je sais comment créer une image mais merci lol

    J'ai du mal exprimer ma question :

    Je pars d'une image que l'on nommera img1.png qui se trouve dans la memoire du tel, cad à l'url file:///root1/photos/img1.png
    Je veux afficher cette image à l'écran. Jusque là aucun souci, ca marche.

    Mais apres, j'ai voulu l'afficher à l'écran en lui ajoutant un effet sépia (les effets gérés dans la JSR 234 sont : "monochrome", "negative", "emboss", "sepia", "solarize", "redeyereduction")

    Dans l'appli de démo AdvancedMultimediaSupplements présent dans le WTK 2.0, j'ai vu comment on peut faire pour traiter des images placées directement dans le dossier "res" de l'appli, enfin là en l'occurence ils sont dans res/images. mais peut importe, là n'est pas le problème :
    dans ce code, ils font :

    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
    private void createProcessedImage() {
    
            try {
    
                MediaProcessor mp = GlobalManager.createMediaProcessor(
                        "image/" + format_array[indexInputImageFormat]);
    
                mp.addMediaProcessorListener(this);
    
                // create a OutputStream that will receive the resulting image
                outputStream = new ByteArrayOutputStream();
    
                 inputStream = getClass().getResourceAsStream(stream_array[indexInputImageFormat]);
                    mp.setInput(inputStream, MediaProcessor.UNKNOWN);
              
                mp.setOutput(outputStream);
    
    .......
    stream_array[indexInputImageFormat] ca vaut : "/images/lenna96x96.jpg" ou "/images/su15.jpg",ou "/images/mig15.png". Ce sont des images se trouvant dans leur dossier res/images
    moi j'ai donc essayé en mettant file:///root1/photos/img1.png, vu que je souhaite modifier des images du tel, càd des images se trouvant à l'url file:////...
    Ca compile mais ca me sort une erreur :
    java/lang/IllegalArgumentException: Invalid input stream.
    Et du coup je vois pas comment faire. Que dois-je mettre en inputstream pour que ca marche?

  5. #5
    Membre actif
    Profil pro
    Analyste programmeur
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Finlande

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Par défaut
    désolé ta question ne m'a pas paru tres claire sur le coup...(ca l'est un peu plus)

    pour etre plus clair, les images qui sont dans la demo, sont-elles dans un jar?
    si c'est le cas, ton soucis est "juste" la lecture d'un fichier, ca doit pas etre sorcier...(je dis ca...)

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut
    non, les images de la démo sont dans le dossier res/images de l'appli.

    Par contre les miennes sont en mémoir téléphone. Or d'après ce que j'ai déjà fait j'ai pu voir que l'url des photos se trouvant sur le tel est : file:///root1/photos/
    et là tu as ttes tes images. Pour que ca marche avec l'emulateur, j'ai mis les images dans le dossier qu'il faut, mais avec le tel il prendra les bonnes images direct

    J'ai déjà récupéré les images, ca je sais le faire. Donc je peux en faire des tableaux de byte, et tout et tout, mais je sais pas comment en faire un inputstream qui serait ok pour que quand j'exécute, j'ai pas cette erreu : java/lang/IllegalArgumentException: Invalid input stream. et pour que ca marche bien sur.... en meme tps c'est le but, que ca marche lol

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut
    J'ai essayé de créer un inputstream à partir de l'image en récupérant le tableau d'entier avec getRGB(...) et à partir de ce tableau de le convertir en tableau de byte, histoire de créer mon inputstream. Ca compile, mais en fait il y a un souci lors de l'exécution : java/lang/IllegalArgumentException: Invalid input stream.

    Moi j'ai défini l'input type en tant que : image/png, et mes images sont bien des png à l'origine. Alors je vois pas ou est le problème..... mais pourtant il y en a toujours un

    J'ai mis mon code plus bas pour que vous puissiez voir, et peut être que quelqu'un pourra me dire ou ca ne va pas .... s'il vous plait
    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
    24
    25
    26
    27
    28
    29
    30
    31
     
     
    MediaProcessor mp = GlobalManager.createMediaProcessor(image/png);
     // create a OutputStream that will receive the resulting image
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    // img = objet de type Image construit à partir 
    // de la photo récupérée dans le tel
    int widthImg=img.getWidth();
    int heightImg=img.getHeight();
    int size = widthImg*heightImg;
    int rgbData[] = new int[size];
     
    // on récupère le tab d'entier contenant les infos sur l'image
    img.getRGB(rgbData, 0, widthImg, 0, 0, widthImg, heightImg);
     
    // on récupère le tab de byte correspondant à rgbData[]
    byte[] b = intArrayToByteArray(rgbData);
    // on crée l'InputStream
    InputStream inputStream =  new ByteArrayInputStream(b);
    mp.setInput(inputStream,MediaProcessor.UNKNOWN);
    // on setOutput
    mp.setOutput(outputStream);
    ImageEffectControl iec = (ImageEffectControl)mp.getControl(
              "javax.microedition.amms.control.imageeffect.ImageEffectControl");
    // set effect
    iec.setPreset("monochrome");
     
    // do processing
    mp.complete();
    Image processedImg = createStreamARGBImage(outputStream,
                                       img.getWidth(), img.getHeight());
    Ci dessous le code de la fonction intArrayToByteArray :

    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
     
     
    private static byte[] intArrayToByteArray(int[] ints) {
       byte[] bytes=new byte[ints.length*4];
       int intcount, bytecount;
       int argb,a,r,g,b;
       for (intcount = 0, bytecount = 0; intcount < ints.length; intcount++) {
    	argb = ints[intcount];
    	a = ((argb & 0xff000000) >> 24); // alpha channel
    	r = ((argb & 0x00ff0000) >> 16); // red channel
    	g = ((argb & 0x0000ff00) >> 8); // green channel
    	b = ((argb & 0x000000ff)); // blue channel 
    	bytes[bytecount]=(new Integer(a)).byteValue();
    	bytecount++;
    	bytes[bytecount]=(new Integer(r)).byteValue();
    	bytecount++;
    	bytes[bytecount]=(new Integer(g)).byteValue();
    	bytecount++;
    	bytes[bytecount]=(new Integer(b)).byteValue();
    	bytecount++;
    	}
    	return bytes;
        }

  8. #8
    Membre actif
    Profil pro
    Analyste programmeur
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Finlande

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Par défaut
    Hello, si je puis me permettre :
    - test si ton inputstream est correcte, par exemple tu as un fonction qui te permet de construire une image à partir d'un inputstream (je propose au cas ou...) : createImage(InputStream stream)
    si tu as une illegalargumentexception, ton inputstream est forcement mal construit

    -pour la construction de ton inpustream, tu as regardé du coté de la class Connector? avec la methode static openInputStream(String name) , le tout est de savoir ce qu'il faut lui passer en parametre, si le chemin vers un fichier en local est autorisé.

    j'espere t'avoir aidé.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut
    Bah tu as raison, c'est mon InputStream qui est mal construit, vu que quand j'essaye de créer un obj Image à partir de mon InputStream, le programme plante

    Je vais donc regarder du coté de la class Connector, comme tu me l'a conseillé ... En espérant que ca marche.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut Solution !!!!
    Voilà, ca marche!!!!! Merci beaucoup nonoRedDevils de m'avoir mise sur la piste

    Au cas où quelqu'un aurait un problème similaire, voici mon code :
    (je n'ai pas mis les exceptions qu'il faut gérer, cad MediaException.... vous saurez faire )

    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
    MediaProcessor mp = GlobalManager.createMediaProcessor(URL_TYPE_IMG);
    // create a OutputStream that will receive the resulting image
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    									
    InputStream inputStream = Connector.openInputStream(URL_DIRPHOTOS+name);
    mp.setInput(inputStream,MediaProcessor.UNKNOWN);
    
    mp.setOutput(outputStream);
    ImageEffectControl iec = (ImageEffectControl)mp.getControl("javax
    .microedition.amms.control.imageeffect.ImageEffectControl");
    // set effect
    iec.setPreset("sepia");
    iec.setEnabled(true);
    // do processing
    mp.complete();
    Image processedImg = createStreamARGBImage(outputStream, 
    img.getWidth(), img.getHeight());
    Et ensuite celui de ma fonction createStreamARGBImage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private static Image createStreamARGBImage(ByteArrayOutputStream os, int w, int h) {
            byte[] bytearray = os.toByteArray();
            System.out.println("taille outputstream = "+bytearray.length);
            //return Image.createImage(bytearray, 0, bytearray.length);
            try {
    		Image img = Image.createImage(new ByteArrayInputStream(bytearray, 0, bytearray.length));
                    return img;
             } catch (java.io.IOException e) {System.out.println("IOException: " + 
                        "Unable to get input stream! Generating test image!");}
            return Image.createRGBImage(byteArrayToIntArray(bytearray), w, h, true);
        }
    et la fonction byteArrayToIntArray dont vous aurez également besoin :
    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
     
    private static int[] byteArrayToIntArray(byte[] bytes) {
        int[] ints = new int[bytes.length / 4];
     
        int intcount, bytecount;
        for (intcount = 0, bytecount = 0; bytecount < bytes.length; ) {
            ints[intcount] = 
                    (( ((int)(bytes[bytecount + 0])) << 24) & 0xFF000000) |  //A
                    (( ((int)(bytes[bytecount + 1])) << 16) & 0x00FF0000) |  //R
                    (( ((int)(bytes[bytecount + 2])) << 8)  & 0x0000FF00) |  //G
                    (( ((int)(bytes[bytecount + 3]))        & 0x000000FF) ); //B
     
            intcount++;
            bytecount+=4;
     
        }
        return ints;
    }
    Voilà.... en tout cas merci encore pour votre aide bonne chance à tous ceux qui galèrent avec le traitement d'image......

  11. #11
    Membre actif
    Profil pro
    Analyste programmeur
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Finlande

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Par défaut
    héhé ! cool pour toi
    bonne continuation

Discussions similaires

  1. [FPDF] problème avec les images dans un tableau dynamique
    Par GADSN dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 08/04/2009, 11h11
  2. problème avec les images
    Par wind_vinch dans le forum VB.NET
    Réponses: 9
    Dernier message: 28/03/2007, 22h23
  3. Réponses: 6
    Dernier message: 17/11/2005, 14h39
  4. TreeView - Problème avec les images
    Par LoicH dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/06/2005, 18h50

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