Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
764 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°609062
Dephi
Posté le 12-01-2004 à 15:48:32  profilanswer
 

: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

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

mood
Publicité
Posté le 12-01-2004 à 15:48:32  profilanswer
 

n°609090
Predicator
Posté le 12-01-2004 à 16:04:45  profilanswer
 

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:

n°609114
Dephi
Posté le 12-01-2004 à 16:18:55  profilanswer
 

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: )


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

n°609125
chrisbk
-
Posté le 12-01-2004 à 16:29:50  profilanswer
 

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

n°609129
the real m​oins moins
Posté le 12-01-2004 à 16:32:00  profilanswer
 

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 ?
n°609131
the real m​oins moins
Posté le 12-01-2004 à 16:33:44  profilanswer
 

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


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°609140
El_gringo
Posté le 12-01-2004 à 16:37:38  profilanswer
 

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 !
n°609142
chrisbk
-
Posté le 12-01-2004 à 16:38:11  profilanswer
 

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
n°609146
the real m​oins moins
Posté le 12-01-2004 à 16:41:04  profilanswer
 

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 ?
n°609270
benou
Posté le 12-01-2004 à 18:17:29  profilanswer
 

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
mood
Publicité
Posté le 12-01-2004 à 18:17:29  profilanswer
 

n°610124
El_gringo
Posté le 13-01-2004 à 08:53:47  profilanswer
 

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 !
n°610142
Predicator
Posté le 13-01-2004 à 09:31:24  profilanswer
 

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

n°610147
benou
Posté le 13-01-2004 à 09:41:39  profilanswer
 

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
n°610160
Predicator
Posté le 13-01-2004 à 09:51:24  profilanswer
 

ouais dans ce cas :jap:

n°610219
El_gringo
Posté le 13-01-2004 à 11:20:37  profilanswer
 

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 !
n°610224
Predicator
Posté le 13-01-2004 à 11:23:36  profilanswer
 

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:

n°610242
benou
Posté le 13-01-2004 à 11:35:45  profilanswer
 

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
n°610250
Predicator
Posté le 13-01-2004 à 11:43:05  profilanswer
 

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]

n°610254
benou
Posté le 13-01-2004 à 11:45:51  profilanswer
 

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
n°610259
Dephi
Posté le 13-01-2004 à 11:56:24  profilanswer
 

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

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

n°610347
El_gringo
Posté le 13-01-2004 à 13:55:10  profilanswer
 

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 !
n°610351
benou
Posté le 13-01-2004 à 13:57:32  profilanswer
 

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
n°610423
Dephi
Posté le 13-01-2004 à 14:30:12  profilanswer
 

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)
 
 
 


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

n°610427
Predicator
Posté le 13-01-2004 à 14:30:42  profilanswer
 

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

n°610507
El_gringo
Posté le 13-01-2004 à 15:50:10  profilanswer
 

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 !
n°620470
Predicator
Posté le 23-01-2004 à 17:32:47  profilanswer
 

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 ? :??:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[access] Liste déroulante et requête [Résolu][résolu] Streaming avec FLASH
Script qui change l'image a chaque visite?Executer une macro a partir d'une autre
[ASP+SQL SERVER] Affichage de la structure d'une BDD (Résolu)[Résolu][JS] : SetTimeOut avec Mozilla ne marche pas ?
[MySQL] Modifier la valeur de l'AUTO_INCREMENT [résolu][PHP] redimensionner une image ?
[VB] remplir base access à partir d'un tableau excelRésolu : Comment rendre invisible dynamiquement une zone de texte?
Plus de sujets relatifs à : Obtenir une image a partir d'une rotation d'une autre... [RESOLU]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR