Obtenir une image a partir d'une rotation d'une autre... [RESOLU]

Obtenir une image a partir d'une rotation d'une autre... [RESOLU] - Java - Programmation

Marsh Posté le 12-01-2004 à 15:48:32    

:hello:  
 
 
Je cherche un moyen simple d'obtenir une image a partir d'une rotation (de 90° et seulement de 90°)...
Cela existe t-il en Java ??
Ou quelqu'un aurait il un morceau de code qui fait cela ?
(je trouve rien avec google..)
 
Attention, je ne veux pas modifier le Renderer de cette image (à travers Graphics2D) mais obtenir un nouvel objet Java Image...
 
 
Merciiiii
 :jap:


Message édité par Dephi le 13-01-2004 à 14:30:27

---------------

Reply

Marsh Posté le 12-01-2004 à 15:48:32   

Reply

Marsh Posté le 12-01-2004 à 16:04:45    

Dephi a écrit :

:hello:  
 
 
Je cherche un moyen simple d'obtenir une image a partir d'une rotation (de 90° et seulement de 90°)...
Cela existe t-il en Java ??
Ou quelqu'un aurait il un morceau de code qui fait cela ?
(je trouve rien avec google..)
 
Attention, je ne veux pas modifier le Renderer de cette image (à travers Graphics2D) mais obtenir un nouvel objet Java Image...
 
 
Merciiiii
 :jap:  


 
tu crée une BufferedImage avec les bonnes dimensions, tu récupère son Graphics2D, tu colle dedans l'image d'origine rotationnée, et voilà tu as ton image :hello:

Reply

Marsh Posté le 12-01-2004 à 16:18:55    

predicator a écrit :


 
tu crée une BufferedImage avec les bonnes dimensions, tu récupère son Graphics2D, tu colle dedans l'image d'origine rotationnée, et voilà tu as ton image :hello:  


 
Mais justement, comment j'obtiens cette image rotationée ???
 :??:  
(j'ai essayé d'utiliser un AfineTransform mais j'y arrive pas..  :cry: )


---------------

Reply

Marsh Posté le 12-01-2004 à 16:29:50    

ben si c faire une roation de 90 tu recopie les lignes dans les colonnes et hop

Reply

Marsh Posté le 12-01-2004 à 16:32:00    

chrisbk a écrit :

ben si c faire une roation de 90 tu recopie les lignes dans les colonnes et hop

bourrin :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 12-01-2004 à 16:33:44    

jveux pas dire mais http://java.sun.com/j2se/1.4.2/doc [...] te(double) ...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 12-01-2004 à 16:37:38    

Moi j'ai la solution avec JAI
Si tu veux rester compatible avec un JDK inférieur à 1.4, je pense pas que tu puisses t'en passer. Après, je sais que dans le 1.4, Snu à intégré pas mal de classes de gestion des images. Peut être qu'on peut faire une rotation siplement avec le JDK. JAI c'est une librairie de gestion graphique, plutôt puissante.
Si ça t'interresse, je peut te filer le bout de code pour faire une rotation en utilisant JAI (ce qui implique que tu livre 1,5Mo de Jar en plus avec ton appli).


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 12-01-2004 à 16:38:11    

jar de 1.5mo pour faire une rotation de 90, je reve [:wam]
 
faite le a la main ou utiliser le truc de --, mais arretez de rigoler quand meme !


Message édité par chrisbk le 12-01-2004 à 16:38:31
Reply

Marsh Posté le 12-01-2004 à 16:41:04    

chrisbk a écrit :

jar de 1.5mo pour faire une rotation de 90, je reve [:wam]
 
faite le a la main ou utiliser le truc de --, mais arretez de rigoler quand meme !

d'autant que si c'est pour roter(*) un Graphics2D, jai servira à rien.
 
 
 
* mon père utilisait à une époque un logiciel de graphisme pour lequel il recevait des formations à domicile, dispensées par une flamande. et quand il s'agissait d'effectuer une rotation sur une image, elle employait le verbe "roter" [:boidleau]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 12-01-2004 à 18:17:29    

chrisbk a écrit :

jar de 1.5mo pour faire une rotation de 90, je reve [:wam]
 
faite le a la main ou utiliser le truc de --, mais arretez de rigoler quand meme !


pkoi utiliser une trotinette pour se rendre à l'autre bout de la rue quand on pourrait utiliser une rolls ? :o


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 12-01-2004 à 18:17:29   

Reply

Marsh Posté le 13-01-2004 à 08:53:47    

chrisbk a écrit :

jar de 1.5mo pour faire une rotation de 90, je reve [:wam]
 
faite le a la main ou utiliser le truc de --, mais arretez de rigoler quand meme !


 
Ben, c'est bien pour ça que je le préviens...


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 13-01-2004 à 09:31:24    

benou a écrit :


pkoi utiliser une trotinette pour se rendre à l'autre bout de la rue quand on pourrait utiliser une rolls ? :o


parce que le temps de démarrer la rolls, tu serais déjà arrivé au bout de la rue avec la trotinette :o

Reply

Marsh Posté le 13-01-2004 à 09:41:39    

predicator a écrit :


parce que le temps de démarrer la rolls, tu serais déjà arrivé au bout de la rue avec la trotinette :o  


ouais mais la rolls c'est trop la frime quoi http://perso.wanadoo.fr/vieuxbenou/benous/benou_15.gif


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 13-01-2004 à 09:51:24    

ouais dans ce cas :jap:

Reply

Marsh Posté le 13-01-2004 à 11:20:37    

predicator a écrit :


parce que le temps de démarrer la rolls, tu serais déjà arrivé au bout de la rue avec la trotinette :o  


 
Sauf que là on parle pas de rolls, mais de classes Java. Et en l'occurences, si les perfs de la rotation sont importantes, t'as plutôt intéret à utiliser JAI qui peut utiliser des routines C pour effectuer les opérations plus rapidement. A condition de livrer une version de JAI spécifique à l'OS sur lequel installer l'appli, et d'installer les librairies de manières à ce qu'elle soient accessibles à l'appli (spécifique à l'OS aussi). Si elle le sont pas, JAI passe en mode "pure Java".
Disons que JAI c'est une trotinette, avec un moteur de rolls ! :D


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 13-01-2004 à 11:23:36    

el_gringo a écrit :


 
Sauf que là on parle pas de rolls, mais de classes Java. Et en l'occurences, si les perfs de la rotation sont importantes, t'as plutôt intéret à utiliser JAI qui peut utiliser des routines C pour effectuer les opérations plus rapidement. A condition de livrer une version de JAI spécifique à l'OS sur lequel installer l'appli, et d'installer les librairies de manières à ce qu'elle soient accessibles à l'appli (spécifique à l'OS aussi). Si elle le sont pas, JAI passe en mode "pure Java".
Disons que JAI c'est une trotinette, avec un moteur de rolls ! :D


 
1.5 Mo le jar, j'appelle pas ça une trotinette... Quid de l'utilisation dans une applet ? il faut se taper les 1.5 Mo en plus ? :sleep:

Reply

Marsh Posté le 13-01-2004 à 11:35:45    

predicator a écrit :


1.5 Mo le jar, j'appelle pas ça une trotinette... Quid de l'utilisation dans une applet ? il faut se taper les 1.5 Mo en plus ? :sleep:  


oui
 
mais qui a dit qu'il faiait une applet ? (j'ai loupé un truc ?)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 13-01-2004 à 11:43:05    

benou a écrit :


oui
 
mais qui a dit qu'il faiait une applet ? (j'ai loupé un truc ?)


 
non non je parle dans le cas général, c'est pas toujours la meilleure solution d'embarquer un jar de 1.5 Mo, même si c'est une Rolls [:spamafote]

Reply

Marsh Posté le 13-01-2004 à 11:45:51    

predicator a écrit :


non non je parle dans le cas général, c'est pas toujours la meilleure solution d'embarquer un jar de 1.5 Mo, même si c'est une Rolls [:spamafote]  


bha oui bien sûr, mais bno, c'est pas parce que dans le cas des applets c'est pas top que ca vaut pas le coup d'évoquer JAI ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 13-01-2004 à 11:56:24    

Arf, j'voulais pas animer le forum comme ca avec ma question...
 :D  
 
Je cherchais seulement un moyen d'appliquer une rotation de 90° sur une image... (mais sans passer par Graphics2D et les AffineTransform car "intégration" difficile avec JGraph..)  
 
J'ai finalement écrit le code (inversion pixels ligne/colonne), le voici si ca intéresse du monde...
 

Code :
  1. public static ImageIcon rotation90RightForImage(ImageIcon imageIcon_p) {
  2.  int width_l = imageIcon_p.getIconWidth();
  3.  int height_l = imageIcon_p.getIconHeight();
  4.  int nbPixels_l = width_l * height_l;
  5.  int[] pixels_l = new int[nbPixels_l];
  6.  PixelGrabber pixelGrabber_l = new PixelGrabber(imageIcon_p.getImage(), 0, 0, width_l, height_l, pixels_l, 0, width_l);
  7.  try {
  8.   pixelGrabber_l.grabPixels();
  9.   // rotation de 90° (droite)
  10.   int[] dest_l = new int[nbPixels_l];
  11.   int offset_l = 0;
  12.   for (int y = 0; y < height_l; y++) {
  13.    for (int x = 0; x < width_l; x++) {
  14.    dest_l[x * height_l + (height_l - 1 - y)] = pixels_l[offset_l++];
  15.    }
  16.   }
  17.   // creer la nouvelle image apres rotation (on inverse width_p et height_p)
  18.   ImageProducer imageProducer_l = new MemoryImageSource(height_l, width_l, dest_l, 0, height_l);
  19.   ImageIcon newImageIcon_l = new ImageIcon(java.awt.Toolkit.getDefaultToolkit().createImage(imageProducer_l));
  20.   return newImageIcon_l;
  21.  }
  22.  catch (InterruptedException ex) {
  23.   ex.printStackTrace();
  24.   return null;
  25.  }
  26. }


 
 
 
Aucun souci niveau perf, C immédiat  :)  
 
Mercii  
 :jap:


Message édité par Dephi le 13-01-2004 à 14:26:29

---------------

Reply

Marsh Posté le 13-01-2004 à 13:55:10    

predicator a écrit :


 
1.5 Mo le jar, j'appelle pas ça une trotinette... Quid de l'utilisation dans une applet ? il faut se taper les 1.5 Mo en plus ? :sleep:  


 
J'ai dit "trotinnette avec moteur de rolls", tu crois que c'est léger un moteur de rolls ? :D
Après, évidement, si t'es dans une applet, on va éviter. Mais dans à peu près tous les autres cas, on s'en tape de livrer 1,5M en plus...


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 13-01-2004 à 13:57:32    

juste pour info, dans le cas de JAI y a quand même le temps d'initialisation de plusieurs secondes à prendre en compte (juste à la première utilisation)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 13-01-2004 à 14:30:12    

J'ai réecrit la méthode un peu plus proprement...
 
En tout cas, il était hors de question que je livre une lib supplémentaire de 1.5 Mo, la seul lib que je livre fait 147 ko (JGraph)
 
 
 


---------------

Reply

Marsh Posté le 13-01-2004 à 14:30:42    

et je parlais d'applet, car moi j'en ai précisément besoin dans une applet :)
oui, on peut avoir besoin de telles choses dans une applet :D

Reply

Marsh Posté le 13-01-2004 à 15:50:10    

predicator a écrit :

et je parlais d'applet, car moi j'en ai précisément besoin dans une applet :)
oui, on peut avoir besoin de telles choses dans une applet :D  


 
C'est pas spécialement étonnant!


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 23-01-2004 à 17:32:47    

Dephi a écrit :


(j'ai essayé d'utiliser un AfineTransform mais j'y arrive pas..  :cry: )


 
effectivement moi non plus ça marche pas :??:  
 
Voilà le code :
 

Code :
  1. InternalImageriePanel(Image img, int angle) {
  2.   if (img != null) {
  3.    this.image = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_BYTE_GRAY);
  4.    setSize(img.getWidth(this), img.getHeight(this));
  5.    size = new Dimension(img.getWidth(this), img.getHeight(this));
  6.    setPreferredSize(size);
  7.    debug("On passe à size = " + getPreferredSize());
  8.    Graphics2D biC = image.createGraphics();
  9.    loaded = biC.drawImage(img, 0, 0, this);
  10.   } else {
  11.   }
  12.   debug("loaded = " + loaded);
  13.   if (angle != 0) {
  14.    this.angle = angle;
  15.    debug("Taille de l'image : " + image.getWidth() + "," + image.getHeight());
  16.    double rad = Math.toRadians(this.angle);
  17.    debug("Angle = " + this.angle + "(en radians : " + rad + " )" );
  18.    AffineTransform rot = AffineTransform.getRotateInstance(rad);
  19.    AffineTransformOp rotOp = new AffineTransformOp(rot, AffineTransformOp.TYPE_BILINEAR);
  20.    int newWidth = Math.abs((int) (image.getWidth() * Math.cos(rad) + image.getHeight() * Math.sin(rad)) + 1);
  21.    int newHeight = Math.abs((int) (image.getHeight() * Math.cos(rad) + image.getWidth() * Math.sin(rad)) + 1);
  22.    //size = new Dimension(newWidth, newHeight);
  23.    //BufferedImage res = new BufferedImage(newWidth, newHeight, image.getType());
  24.    BufferedImage res = null;
  25.    try{
  26.     res = rotOp.createCompatibleDestImage(image,null);
  27.    }catch(RasterFormatException e){
  28.     e.printStackTrace();
  29.     res = new BufferedImage(1,1,BufferedImage.TYPE_BYTE_GRAY);
  30.    }
  31.    debug("Nouvelle Taille : " + res.getWidth() + "," + res.getHeight());
  32.    debug("Nouvelle Taille théorique : " + newWidth + "," + newHeight);
  33.    this.image = res;
  34.    setSize(image.getWidth(), image.getHeight());
  35.    size = new Dimension(image.getWidth(), image.getHeight());
  36.    setPreferredSize(size);
  37.   }
  38.   setOpaque(true);
  39.   addMouseListener(this);
  40.   addMouseMotionListener(this);
  41.  }


 
et voilà la Trace pour un angle de 90° :
 

Code :
  1. ImageriePanel > On passe à size = java.awt.Dimension[width=2113,height=3149]
  2. ImageriePanel > loaded = true
  3. ImageriePanel > Taille de l'image : 2113,3149
  4. ImageriePanel > Angle = 90(en radians : 1.5707963267948966)
  5. java.awt.image.RasterFormatException: Transformed width (0) is less than or equal to 0.
  6. ImageriePanel > Nouvelle Taille : 1,1
  7. ImageriePanel > Nouvelle Taille théorique : 3150,2114
  8. at java.awt.image.AffineTransformOp.createCompatibleDestImage(Unknown Source)
  9. at imadoc.annotcoll.client.ImageriePanel$InternalImageriePanel.<init>(ImageriePanel.java:95)
  10. at imadoc.annotcoll.client.ImageriePanel.<init>(ImageriePanel.java:466)
  11. at imadoc.annotcoll.client.ImageriePanel.main(ImageriePanel.java:539)


 
Le truc, c'est que ça marche pas pour un angle de 90°, mais pour un angle de 45° ça marche :heink:  
 

Code :
  1. ImageriePanel > On passe à size = java.awt.Dimension[width=2113,height=3149]
  2. ImageriePanel > loaded = true
  3. ImageriePanel > Taille de l'image : 2113,3149
  4. ImageriePanel > Angle = 45(en radians : 0.7853981633974483)
  5. ImageriePanel > Nouvelle Taille : 1495,3721
  6. ImageriePanel > Nouvelle Taille théorique : 3721,3721
  7. ImageriePanel > drawImage


 
Les valeurs que Java calcule pour la taille de l'image rotationnée me paraissent vraiment très louches :heink:
Quelque soit l'angle utilisé, seule la hauteur de l'image est bonne, la largeur est complètement fausse...
 
Vous avez une idée sur ce point louche ? :??:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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