[RESOLU] AffineTransformOp qui zap des données

AffineTransformOp qui zap des données [RESOLU] - Java - Programmation

Marsh Posté le 26-01-2004 à 10:36:50    

Salut,
 
suite à mon problème avec une rotation d'image, j'ai compris comment fonctionnait l'opération de rotation, et pourquoi ça ne marchait pas... Au lieu de prendre l'image complète, il ne prend qu'une partie des données. l'image suivante explique mieux que les mots :
 
Ce mode de fonctionnement est un mode de fonctionnement normal. Les données rotationnées ajoutent du blanc autour de l'image, mais tout est prix en compte.
 
http://predicator.free.fr/images/Rotation01.jpg
 
Et voilà comment fonctionne l'opérateur de rotation de Java. Il fait pivoter l'image autour du point (0,0), ce qui ne serait pas gênant si ce même opérateur prenait en compte les données à gauche de ce point. Voilà l'image qu'il recrée :
 
http://predicator.free.fr/images/Rotation02.jpg
 
Je comprend maintenant pourquoi il me dit que la largeur est de 0 pour un angle de 90°...
Vous savez comment contrer ce mode de fonctionnement ? Ca me parait vraiment louche qu'un tel opérateur fassent de telles erreurs... Voilà le code qui génère l'image :
 

Code :
  1. int angle = 20; //angle en degrés
  2. double rad = Math.toRadians(angle); //Angle en radians
  3. AffineTransform rot = AffineTransform.getRotateInstance(rad);
  4. AffineTransformOp rotOp = new AffineTransformOp(rot, AffineTransformOp.TYPE_BILINEAR);
  5. BufferedImage res = rotOp.filter(image,null);


 
Voilà la taille de l'image originale :
Taille de l'image : 2113,3149
Voilà la taille de l'image pivotée, en toute logique :
Nouvelle Taille théorique : 3063,3682
Voilà la taille de l'image telle que la conçoit Java :
Nouvelle Taille : 1986,3682
 
plus de 1000 pixels perdus en largeur...
 
Vous avez une idée de comment corriger ça ? merci...


Message édité par Predicator le 26-01-2004 à 11:06:53
Reply

Marsh Posté le 26-01-2004 à 10:36:50   

Reply

Marsh Posté le 26-01-2004 à 11:06:37    

C'est résolu. Voilà la méthode :
 

Code :
  1. int newWidth = Math.abs((int) (image.getWidth() * Math.cos(rad) + image.getHeight() * Math.sin(rad)) + 1);
  2. int newHeight = Math.abs((int) (image.getHeight() * Math.cos(rad) + image.getWidth() * Math.sin(rad)) + 1);
  3. AffineTransform at = AffineTransform.getTranslateInstance((newWidth-image.getWidth())/2,(newHeight-image.getHeight())/2);
  4. at.rotate(rad, image.getWidth()/2, image.getHeight()/2);
  5. AffineTransformOp rotOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
  6. BufferedImage res = rotOp.filter(image,null);


 
heureusement que j'ai trouvé, vous semblez de pas aimer mes questions... trop compliquées ? :lol:


Message édité par Predicator le 26-01-2004 à 11:07:17
Reply

Marsh Posté le 09-06-2008 à 18:59:51    

C'est exactement ce que je cherchais, après des heures passées à bricoler avec ces satanées rotations  :o  
Mais j'avais juste besoin de tourner une image de 90°, voici ce que ça donne (en JDK 1.6):
 
        newWidth=image.getHeight(); newHeight = image.getWidth();
        AffineTransform at = AffineTransform.getTranslateInstance((newWidth-image.getWidth())/2, (newHeight-image.getHeight())/2);
        at.concatenate( AffineTransform.getQuadrantRotateInstance(1, image.getWidth()/2, image.getHeight()/2) );
        AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
        BufferedImage rotationImage = new BufferedImage(newWidth, newHeight, image.getType());
 
C'est propre et rapide.
 
Un grand merci, cet exemple sera utile à tous ceux qui veulent appliquer une rotation à une BufferedImage

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed