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 :

[JAVA2D] Rotation d'une image


Sujet :

2D Java

  1. #1
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut [JAVA2D] Rotation d'une image
    Bonjour,
    J'utilise JasperReport pour impirmer des codes barre (avec barbecue). Or j'ai besoin de faire pivoter ces codes barre de 90°. JasperReport ne savant pas faire celà, je doit développer une méthode qui s'en chargera.
    J'arrive donc à générer le code barre à partir d'une méthode externe à jasperReport et à l'intégrer dans mon document. Il ne me reste plus qu'a faire pivoter ce code barre avant de l'insérer dansle document.
    Mais je n'y arrive pas L'API barbecue me renvoie le code barre dans un objet BufferredImage. ET j'ai beau essayer de le faire pivoter avec AffineTransformOp j'ai du mal.

    Voici la méthode qui devrait me génèrer un bufferredImage avec le code barre pivoté :
    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
    32
    33
    34
    35
    36
    37
    38
    39
     
    public class RotateBarCode {
     
    	private static net.sourceforge.barbecue.Barcode bc = null;
    	//private static AffineTransform tx = AffineTransform.getRotateInstance(Math.PI);
    	//private static AffineTransform tx = new AffineTransform(0.5, 0, 0, 0.5, 0, 0);
    	private static AffineTransform tx = new AffineTransform();
    	static{
    		tx.setToRotation(Math.PI/2);
    	}
    	private static AffineTransformOp transf = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
     
     
    	public static BufferedImage getImage(Object aText, boolean showText, boolean checkSum) {
    		String text = new StringBuffer().append(aText).toString();
     
    		try{
    			bc = BarcodeFactory.createCode39(text, checkSum);
    			bc.setBarHeight(37);
    			bc.setBarWidth(1);
     
    			bc.setDrawingText(showText);
    			BufferedImage bi0 = net.sourceforge.barbecue.BarcodeImageHandler.getImage(bc);
    			System.out.println("AffineTransform : "+tx);
    			System.out.println("AffineTransformOp : "+transf);
    			System.out.println("AV W:"+bi0.getWidth()+", H:"+bi0.getHeight());
    			BufferedImage bi1 = transf.filter(bi0, null);
    			//BufferedImage bi1 = transf.createCompatibleDestImage(bi0, null);
    			System.out.println("AP W:"+bi1.getWidth()+", H:"+bi1.getHeight());
    			return bi1;
    			//return net.sourceforge.barbecue.BarcodeImageHandler.getImage(bc);
    		}
    		catch (Exception e) {
    			throw new RuntimeException(e.getMessage());
    		}
    	}
     
     
    }
    Si je met une rotationde PI/2 come dans l'exemple j'ai cette erreur :
    java.lang.RuntimeException: Transformed height (0) is less than or equal to 0. at tst.RotateBarCode.getImage(RotateBarCode.java:40)
    avec PI/3 j'ai une rotation mais pas de 90° et les couleur sont inversée (noir devient blanc et vice versa)

    Pouvez-vous m'aider ?

    merci

  2. #2
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Voici une classe que vous pouvez exécuter pour mieux voir le problème :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    package tst;
     
    import java.awt.image.*;
    import java.awt.geom.*;
    import java.awt.*;
    import net.sourceforge.barbecue.*;
    import javax.swing.*;
     
    public class RotateBarCode {
     
    	private static net.sourceforge.barbecue.Barcode bc = null;
    	public static BufferedImage getBareCode(Object aText, boolean showText, boolean checkSum) throws Exception {
    			String text = new StringBuffer().append(aText).toString();
    			bc = BarcodeFactory.createCode39(text, checkSum);
    			bc.setBarHeight(37);
    			bc.setBarWidth(1);
     
    			bc.setDrawingText(showText);
    			return net.sourceforge.barbecue.BarcodeImageHandler.getImage(bc);
    	}
     
    	public static BufferedImage rotate(BufferedImage bi, float angledeg){
    		double radians = Math.toRadians(angledeg);
     
    		AffineTransform tx = AffineTransform.getRotateInstance(radians);
    		AffineTransformOp transf = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
     
    		BufferedImage b10 = transf.createCompatibleDestImage(bi, bi.getColorModel());
    		BufferedImage bi1 = transf.filter(bi, b10);
     
    		return bi1;
     
    	}
     
    	public static void main(String args[]){
    		try{
    			System.out.println("ANGLE : "+args[0]);
    			float ang = Float.parseFloat(args[0]);
     
     
    			BufferedImage bi = getBareCode("123456789", true, false);
     
    			bi = rotate(bi, ang);
     
    			JDialog jd = new JDialog();
    			ImageIcon ic = new ImageIcon(bi);
    			JLabel jl = new JLabel(ic);
    			jd.getContentPane().add(jl);
     
    			jd.setSize(300, 200);
     
    			jd.show();
    		}
    		catch(Exception e){
    			System.err.println("Erreur  : "+e);
    			e.printStackTrace(System.err);
    		}
     
     
    	}
     
     
    }
    Il faut le jar barbecue-1.1.jar dans son CLASSPATH.
    Par exemple :
    java -cp ./barbecue-1.1.jar:. tst.RotateBarCode -10
    affiche un code barre avec une rotation de 10°

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Par défaut
    Eh ben, on pourra dire que je suis du genre acharné

    Après avoir retourné le problème dans tous les sens, j'ai enfin trouvé la solution. Bon je ne m'y connais pas vraiment en manipulation d'images, c'était juste par curiosité

    Le problème vient tout simplement au type de rotation que tu dois demander. Il faut demander une rotation ... autour du point central

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BufferedImage bi;
    AffineTransform tx = AffineTransform.getRotateInstance(radians, bi.getWidth()/2, bi.getHeight()/2);

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Vi car sinon la rotation s'effectue autour de (0, 0). D'ou l'erreur avec un angle de PI/2.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Merci pour votre aide

    Cependant j'ai encore un problème
    Les dimensions de l'image change avec la rotation. Comment faire pour avoir l'image dans son intégralité après la rotation, et si possible tronquer les zones non utilisée de l'image ?

    merci

    Voici l'image original :
    et l'image avec un rotation de 90° :
    Comment se fait-il qe l'image après la rotation soit presqu'un carré alors qu l'image d'origine est un rectangle ?

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Par défaut
    J'avais testé sur le deuxième code que tu as fourni, je n'avais aucun problème lors de la rotation.

  7. #7
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Peux-tu me donner le code que tu as utilisé car moi j'ai le soucis ci-dessus

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Par défaut
    Je ne suis pas sur le même poste, je te filerai ça ce soir.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Par défaut
    Je n'avais pas fais gaffe que je travaillais avec un rotation de 180. Alors avec 90, j'ai le même problème que toi, mais en moins pire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static BufferedImage rotate(BufferedImage bi, float angledeg){
    	double radians = Math.toRadians(angledeg);
    	AffineTransform tx = AffineTransform.getRotateInstance(radians, bi.getWidth()/2, bi.getHeight()/2);
    	AffineTransformOp transf = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
    
    	BufferedImage b10 = transf.createCompatibleDestImage(bi, ColorModel.getRGBdefault());
    	BufferedImage bi1 = transf.filter(bi, b10);
    
    	return bi1;
    }

  10. #10
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    C'est bon j'ai trouvé
    Il fallait générer une nouvelle image plus grande (de la taille de la diagonale de l'image d'origine) pour que la rotation puisse se faire sans perte de pixel.
    Par contre je ne comprend pas trop comment ça se fait que l'image finale est juste à la bonne taille et j'ai encore un peu de mal à comprendre ce que fait Graphic2D.
    Enfin bref j'ai trouvé à force de piocher à droite à gauche mais ça reste assez flou...
    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
     
    	public static BufferedImage rotate(BufferedImage bi, float angledeg){
    		double radians = Math.toRadians(angledeg);
     
    		int w = bi.getWidth();
    		int h = bi.getHeight();
    		int diag = (int)(Math.sqrt(w*w+h*h));
    		BufferedImage bImage2 = new BufferedImage(diag, diag, BufferedImage.TYPE_INT_ARGB);
    		Graphics2D g2 = bImage2.createGraphics();
    		g2.drawImage(bi, (diag-w)/2, (diag-h)/2, null);
     
    		bi = bImage2;
     
    		AffineTransform tx = AffineTransform.getRotateInstance(radians, bi.getWidth()/2, bi.getHeight()/2);
    		AffineTransformOp transf = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
     
    		//BufferedImage b10 = transf.createCompatibleDestImage(bi, bi.getColorModel());
    		BufferedImage b10 = transf.createCompatibleDestImage(bi, ColorModel.getRGBdefault());
    		BufferedImage bi1 = transf.filter(bi, b10);
     
    		return bi1;
    }
    merci encore had35 (enfin si tu peux m'expliquer comment ça marche je suis preneur )

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    - soit tu calcules toi-même ces valeurs à coup de sinus et de cosinus de l'angle utilisé (voir bouquin de trigonométrie).
    - soit tu crées un rectangle aux dimension de l'image que tu transformes avec une transformation affine représentant l'angle approprié et pour finir tu prend la largeur et la hauteur de la boite englobante de la forme résultante.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Par défaut
    Citation Envoyé par bouye
    - soit tu calcules toi-même ces valeurs à coup de sinus et de cosinus de l'angle utilisé (voir bouquin de trigonométrie).
    - soit tu crées un rectangle aux dimension de l'image que tu transformes avec une transformation affine représentant l'angle approprié et pour finir tu prend la largeur et la hauteur de la boite englobante de la forme résultante.
    Pas mieux Graphics2D est un peu obscur pour moi aussi, je l'aborde de façon plus ou moins intuitive pour l'instant.

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

Discussions similaires

  1. Rotation d'une image 2D
    Par FidoDido® dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 29/06/2011, 11h55
  2. Rotation d'une image.
    Par poly128 dans le forum Delphi
    Réponses: 4
    Dernier message: 15/05/2006, 12h26
  3. rotation d'une image
    Par KHEOPS1982 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/12/2005, 17h21
  4. Rotation d'une image TIFF
    Par Tub-95 dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 14/10/2005, 20h56
  5. Définir un angle de rotation pour une image
    Par mateo.14 dans le forum C++
    Réponses: 5
    Dernier message: 25/03/2005, 14h43

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