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

2D Java Discussion :

Algo pour assombrir ou éclaircir une image : ko


Sujet :

2D Java

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Points : 58
    Points
    58
    Par défaut Algo pour assombrir ou éclaircir une image : ko
    Bonjour,
    Je souhaite pouvoir assombrir ou éclaircir une image et pour cela j'ai trouvé un bout de code java qui permet de le faire, sauf qu'il plante systématiquement. J'ai trouvé le même code dans différentes sources du net (avec des variantes mais globalement la même chose) qui montrent que normalement ce code est bon, mais pour une raison qui m'échappe, il plante. Voici ci-dessous le code que j'utilise et le message d'erreur remonté. Si quelqu'un a une idée ... merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static BufferedImage getImageAssombrieEclaircie(BufferedImage image) {
    	BufferedImage dstImage = null;
    	RescaleOp op = new RescaleOp(1.1f, 0.0f, null);// éclaircir de 10%
    	dstImage = op.filter(image, null);
    	return dstImage;
    }
    nb : l'image est une image "compatible"
    Mon environnement : windows (xp ou seven), jre 1.6.0_14

    Message d'erreur :
    #
    # An unexpected error has been detected by Java Runtime Environment:
    #
    # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d5248f7, pid=2388, tid=5860
    #
    # Java VM: Java HotSpot(TM) Client VM (10.0-b22 mixed mode windows-x86)
    # Problematic frame:
    # C [mlib_image.dll+0x548f7]
    #
    # An error report file with more information is saved as:
    # C:\Perso\workspace\SDAMaster\hs_err_pid2388.log
    #
    # If you would like to submit a bug report, please visit:
    # http://java.sun.com/webapps/bugreport/crash.jsp
    # The crash happened outside the Java Virtual Machine in native code.
    # See problematic frame for where to report the bug.
    #
    Avec cette erreur (qui n'est donc pas une erreur java mais d'une dll), mon appli est plantée et fermée.

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    # An error report file with more information is saved as:
    # C:\Perso\workspace\SDAMaster\hs_err_pid2388.log
    EN même temps, ce que tu fournis là comme message d'erreur est juste non compréhensible pour toi, mais également pour les autres humains.

    Que trouves tu dans le fichier log cité?
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    Bonjour,

    Citation Envoyé par Ghorin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static BufferedImage getImageAssombrieEclaircie(BufferedImage image) {
        BufferedImage dstImage = null;
        RescaleOp op = new RescaleOp(1.1f, 0.0f, null);// éclaircir de 10%
        dstImage = op.filter(image, null);
        return dstImage;
    }
    il faut réserver de l'espace mémoire pour ton image destination :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedImage dstImage = new BufferedImage(image_source.getWidth(), image_source.getHeight(), BufferedImage.TYPE_INT_RGB);

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Points : 58
    Points
    58
    Par défaut
    Sinok :
    EN même temps, ce que tu fournis là comme message d'erreur est juste non compréhensible pour toi, mais également pour les autres humains.
    Que trouves tu dans le fichier log cité?
    Effectivement, il aurait été opportun de ma part de mettre le fichier de log, ce que j'ai zappé ! En fait il n'apporte strictement rien car il ne met qu'un classique rapport de dump dont en voici des extraits :
    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
     
    # An unexpected error has been detected by Java Runtime Environment:
    #
    #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d5248f7, pid=2388, tid=5860
    #
    # Java VM: Java HotSpot(TM) Client VM (10.0-b22 mixed mode windows-x86)
    # Problematic frame:
    # C  [mlib_image.dll+0x548f7]
    #
    # If you would like to submit a bug report, please visit:
    #   http://java.sun.com/webapps/bugreport/crash.jsp
    # The crash happened outside the Java Virtual Machine in native code.
    # See problematic frame for where to report the bug.
     
    ...
    ...
    Stack: [0x5f3b0000,0x5f400000],  sp=0x5f3ff148,  free space=316k
    Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
    C  [mlib_image.dll+0x548f7]
    ...
    On y voit que c'est la librairie mlib_image.dll qui a causé le crash apparemment mais rien de plus pour aider.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Points : 58
    Points
    58
    Par défaut
    slim_java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    il faut réserver de l espace mémoire pour ton image destination :
    J'ai rajouté ta correction dans mon code en remplaçant juste BufferedImage.TYPE_INT_RGB par BufferedImage.TYPE_INT_ARGB pour la gestion de la transparence de mes images (format png).
    J'ai maintenant le code ci-dessous et effectivement ça ne plante plus. Par contre le résultat n'est pas joli : j'ai bien une image mais qui ne ressemble absolument par à l'original (une texture de plancher en bois) : à la fin j'ai une image très claire toute blanche avec des bandes verticales bleu ciel (très clair également) et cela quelque soit le paramètre que je met dans le RescaleOp(...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BufferedImage dstImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
    RescaleOp op = new RescaleOp(1.0f, 0.0f, null);
    dstImage = op.filter(image, null);
    return dstImage;

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Bon à priori c'est un bug répertorié (et corrigé pour java 7, enfin si celui ci sort bien un jour, ça c'est une autre histoire).
    http://bugs.sun.com/bugdatabase/view...bug_id=4886506

    Un workaround est proposé dans les comments.
    WORK AROUND: Fairly simplistic work around: copy the source image to a compatible image before applying the rescale op:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BufferedImage source={...}
    BufferedImage adjusted=new BufferedImage(source.getWidth(),source.getHeight(),BufferedImage.TYPE_INT_BGR);
    Graphics2D ug=adjusted.createGraphics();
    ug.drawImage(source,0,0,null);
    ug.dispose();
    BufferedImageOp filter=new RescaleOp(0.5f,0.5f,null);
    BufferedImage dest=filter.filter(adjusted,null);
    should have it sorted. Apparently its fine as long as you avoid BYTE image types.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    Salut,
    je te propose ma fonction assombrir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     public BufferedImage assombrir(BufferedImage image_source) {
          BufferedImage image_destination = new BufferedImage(image_source.getWidth(), image_source.getHeight(), BufferedImage.TYPE_INT_ARGB);
          RescaleOp assombrir = new RescaleOp(0.8f, 0, null);
          assombrir.filter(image_source, image_destination);
          return image_destination;
       }
    j'attends les résultats

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Points : 58
    Points
    58
    Par défaut
    Pour j'attends les résultats :
    Et bien quand je met ton code, ça indique un pb sur les images d'origine et de destination sur la ligne assombrir.filter(ori, dest);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Exception in thread "main" java.lang.IllegalArgumentException: Number of bands in src 3 does not equal number of bands in dest 2
    	at java.awt.image.RescaleOp.filter(Unknown Source)
    	at java.awt.image.RescaleOp.filter(Unknown Source)
    	at ...

    J'ai réussi à contourner ce problème en forçant l'utilisation d'images "compatibles" avec le code modifié suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public BufferedImage assombrir(BufferedImage img) {
    	BufferedImage image_source = createCompatibleImage(img);
    	BufferedImage image_destination = createCompatibleImage(new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB));
    	RescaleOp assombrir = new RescaleOp(0.8f, 0, null);
    	assombrir.filter(image_source, image_destination);
    	return image_destination;
    }
    Mais le résultat est ... une image blanche.

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    Citation Envoyé par Ghorin Voir le message
    Pour j'attends les résultats :
    Et bien quand je met ton code, ça indique un pb sur les images d'origine et de destination sur la ligne assombrir.filter(ori, dest);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Exception in thread "main" java.lang.IllegalArgumentException: Number of bands in src 3 does not equal number of bands in dest 2
        at java.awt.image.RescaleOp.filter(Unknown Source)
        at java.awt.image.RescaleOp.filter(Unknown Source)
        at ...
    OK
    donc tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     BufferedImage image_destination = new BufferedImage(image_source.getWidth(), image_source.getHeight(), image_source.getType();

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Points : 58
    Points
    58
    Par défaut
    Et bien finalement c'est la solution "WORK AROUND" de sinok qui corrige mon problème.

    Pour slim_java : en mettant "getType()" à la place de mettre en dur un type d'image, ça ne change rien => image blanche.


    Ce qui m'étonne c'est que la solution qui fonctionne a le commentaire "Fairly simplistic work around: copy the source image to a compatible image before applying the rescale op". C'est ce que j'avais essayé de faire (ma réponse de 15h52 : forcer des images compatibles) mais sans succès => image blanche également. La différence que je vois dans le work around c'est la re-création de l'image d'origine par le bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Graphics2D 	ug = image_ajustee.createGraphics();
    ug.drawImage(image_source,0,0,null);
    ug.dispose();
    En tout cas, merci à tous pour votre aide si précieuse, ça me permet d'avancer et en plus j'apprends des choses :-)

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 30/09/2008, 19h13
  2. Syntaxe pour l'affichage d'une image en PHP
    Par johnson95 dans le forum Langage
    Réponses: 2
    Dernier message: 18/08/2008, 17h09
  3. Problème pour l'enregistrement d'une image
    Par erkenbrand dans le forum Windows Forms
    Réponses: 4
    Dernier message: 30/04/2008, 09h16
  4. pb pour la rotation d'une image
    Par wawawa dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 04/05/2007, 17h33
  5. Script VBS pour connaitre taille d'une image
    Par fredoh dans le forum Windows
    Réponses: 2
    Dernier message: 24/02/2006, 14h27

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