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 :

Opacité d'une image avec RescaleOp


Sujet :

2D Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Par défaut Opacité d'une image avec RescaleOp
    Bonjour,
    Je tente désespérément de pouvoir gérer l'opacité d'une image à l'aide de la classe RescaleOp. Je me suis basé sur l'exemple de Sun ( http://java.sun.com/docs/books/tutor...drawimage.html ).

    Je ne suis pas certain d'avoir tout compris leur code en réalité. Je ne comprend pas en quoi consiste le tableau de scales (Si j'ai bien compris, son dernier élément correspond à l'opacité désiré), ni le tableau de Offsets.

    De plus, le tableau de offsets n'est jamais initialisé? Je ne comprend pas vraiment l'utilité

    Dans l'exemple de Sun, il crée un tableau de 4 scales et 4 offsets. Lors de mes tests, j'ai été obligé de créer un tableau de 4 scales et 3 offsets, sinon j'avais droit à un beau plantage.

    Je vous montre donc la fonction que j'ai réalisé sencé me retourner un scaleOp applicable à mon image

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        public static RescaleOp setOpacity(float opacity)
        {
    //Si j'ai bien compris, 0.5f sera ma valeur d'opacité
            float[] scales = {1f,1f,1f,0.5f};
            float[] offsets = new float[3];
            RescaleOp rop = new RescaleOp(scales, offsets, null);
        	return rop; 	
        }
    Merci d'avance de votre aide

  2. #2
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Je ne suis pas certain d'avoir tout compris de leur code en réalité. Je ne comprend pas en quoi consiste le tableau de scales, ni le tableau de Offsets.
    La javadoc donne les infos :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //The pseudo code for the rescaling operation is as follows:
     
    for each pixel from Source object {
        for each band/component of the pixel {
            dstElement = (srcElement*scaleFactor) + offset
        }
    }

    le tableau de offsets n'est jamais initialisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float[] offsets = new float[4];
    //est équivalent à :
    float[] offsets = {0f, 0f, 0f, 0f};
    Je tente désespérément de pouvoir gérer l'opacité d'une image [...] j'ai été obligé de créer un tableau de 4 scales et 3 offsets, sinon j'avais droit à un beau plantage.
    Le BufferedImage que tu utilises a bien une couche alpha ?
    Fais-tu comme dans l'exemple une copie de l'image source vers un BufferedImage dont tu maitrise le type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BufferedImage img = ImageIO.read(imageSrc);
    int w = img.getWidth(null);
    int h = img.getHeight(null);
    bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    Graphics g = bi.getGraphics();
    g.drawImage(img, 0, 0, null);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Par défaut
    Bonjour,
    Je crois déjà mieux comprend le fonctionnement

    Je n'avais pas ces deux lignes la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    Graphics g = bi.getGraphics();
    Donc je comprend bien que je n'ai pas de couche alpha, mais si j'en rajoute une, mon image ne s'affiche plus...

    Si on exclue les rescaleOp, y a t-il un autre moyen de gérer l'opacité d'une image?

    Merci d'avance

  4. #4
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Montre voir le code où tu ouvres et dupliques l'image avant de la traiter.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Par défaut
    Salut,
    Ici je charge l'image de base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void loadFile()
    	{
    		try 
    		{
    			File fichier = new File(this.imageUrl);
    			this.image = ImageIO.read(fichier);
    		} 
    		//Si problème
    		catch (IOException e) 
    		{
    			e.printStackTrace();
    		}
    }
    Ici je dessine mon image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private Graphics2D drawImage(Graphics2D g2d)
    	{
    		RescaleOp op = Opacity.setOpacity(0.5f);
                    bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
                    Graphics2D g2d = bi.getGraphics();
    		g2d.drawImage(image, 0, 0,null);
    		return g2d;
    	}
    Et ici le code ou j'applique mon opacité au RescaleOp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	public static RescaleOp setOpacity(float opacity)
        {
            float[] scales = {1f,1f,1f,opacity};
            float[] offsets = new float[4];
            RescaleOp rop = new RescaleOp(scales, offsets, null);
        	return rop; 	
        }
    J'ai réduit le code de ces fonctions avant de les afficher ici, parce que lors de l'affichage, je ne gère pas seulement l'opacité de l'image, mais aussi la rotaiton, son redimenssionement et l'application de filtre.

    Je crois que les autres transformations que je fais subir à l'image est en partie ce qui cause mes problèmes avec mon opacité.

    Merci d'avance pour le temps que vous passerez à y regarde

  6. #6
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Je crois que les autres transformations que je fais subir à l'image est en partie ce qui cause mes problèmes.
    Effectivement ton code semble correct, que donne l'affichage quand tu désactives les autres transformations ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Par défaut
    J'ai droit à un beau :
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Number of scaling constants does not equal the number of of color or color/alpha components

    Comme si j'avais que trois couches à mon bufferedImage, mais elle en a pourtant 4..

    Je ne suis pas certain de comprendre le problème donc

    Merci d'avance

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Par défaut
    J'ai trouvé une autre solution pour appliquer mon opacité : Je vais l'appliquer directement au graphics avec un setComposite. Le tp que je fais étant à remettre pour vendredi, j'ai plus ou moins le temps de me pencher sur le pourquoi du problème, parce que pour tout dire, il me reste encore bien du travail.

    Merci de l'aide que vous m'avez apporter tout de même

  9. #9
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    N'utiliserais-tu pas l'image source "this.image = ImageIO.read(fichier);" qui est accessible dans toute la classe, au lieu de la copie "bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);", c'est ce que semble sous-entend l'erreur.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Par défaut
    J'avais pensé la même chose, mais après vérification, non

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

Discussions similaires

  1. Recuperation de la taille d'une image avec la propriété SRC
    Par CDRIK dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/10/2004, 04h05
  2. [Image]Créer une image avec JAVA 1.1
    Par burno dans le forum 2D
    Réponses: 4
    Dernier message: 11/08/2004, 10h19
  3. Afficher une image avec swing
    Par arnonote dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 07/08/2004, 13h10
  4. [Débutante] Création d'une image avec un composant
    Par gwendo dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 09/07/2004, 10h58
  5. PL/SQL - Comment afficher une image avec HTP ?
    Par patmaba dans le forum PL/SQL
    Réponses: 2
    Dernier message: 08/07/2004, 10h28

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