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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    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 confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    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é?

  3. #3
    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
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    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 confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    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.

  7. #7
    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,
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    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.

+ 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