Question

Je recherche un algorithme qui fait pivoter une image de quelques degrés (entrée).

public Image rotateImage(Image image, int degrees)

(Les occurrences d'image pourraient être remplacées par int [] contenant chaque valeur RVB de pixel, Mon problème est que je dois l'implémenter pour un projet JavaME MIDP 2.0, donc je dois utiliser un code exécutable sur la machine virtuelle Java avant la version 1.5. Quelqu'un peut-il m'aider avec cela?

EDIT: j’ai oublié de mentionner que je n’ai pas d’API SVG et que j’ai besoin d’une méthode de rotation par degré arbitraire autre que 90 - 180 - 270

De plus, aucun package java.awt. * n'est disponible sur MIDP 2.0

Était-ce utile?

La solution

L’une des meilleures pages décrivant les algorithmes de rotation d’image trouvés sur Internet est liée à la bibliothèque excellente leptonica de Dan Bloomberg. Alors que la bibliothèque leptonica elle-même est écrite en C et ne vous aidera pas, sa page sur les algorithmes de rotation des images:

http://www.leptonica.org/rotation.html

vaut vraiment la peine d'être lu. Vous voudrez probablement implémenter quelque chose comme l'algorithme de rotation par zones décrit dans la deuxième partie de la page.

Autres conseils

Solution générale: Pour chaque pixel de l'image de destination, prenez le pixel de l'image source avec les coordonnées du pixel de destination, pivotées dans le sens opposé.

Amélioration de la solution : la rotation ne donne généralement pas les coordonnées exactes en pixels. Effectuez une moyenne pondérée du pixel source avec ses voisins, en fonction du pourcentage de chevauchement avec eux.

Solution plus rapide pour les images binaires: convertissez l'image en " exécute " de pixels de premier plan consécutifs. Faites ensuite pivoter les extrémités de ces lignes et tracez-les dans la destination.

Normalement, cela produira de légers écarts en raison de l'arrondi des nombres entiers. Ainsi, lorsqu'un ou les deux extrémités sont éloignées de plus de 10% d'un entier, corrigez en traçant DEUX lignes pour la ligne source unique, en utilisant les coordonnées des nombres arrondis.

Si un point de terminaison se situe à moins de 10% et l'autre non, les deux lignes formeront une forme en "V". Si les deux sont désactivés de plus de 10%, les deux lignes formeront une forme en «X».

Cela peut être fait par rapport à l’axe X ou l’axe Y. Utilisez celui avec le plus petit angle entre l’axe et l’angle de rotation. (Par exemple, si l'angle de rotation est compris entre 45 et -45, utilisez l'axe X.)

Solution encore plus rapide pour les images binaires: s'il y a moins de pixels d'arrière-plan que de pixels au premier plan, remplissez la destination avec le premier plan et suivez l'algorithme ci-dessus avec les pixels d'arrière-plan.

Les forums Nokia ont un article et un code sur Rotation d'images dans Java ME

LWUIT peut le faire et il est opensource. Je vous suggère de trouver le code ici.

Vous pouvez essayer http://www.j2mearmyknife.com/ . Il comporte de nombreux effets visuels intéressants, notamment la rotation des images.

Graphics2D et AffineTransform vous aideront à faire exactement ce que vous voulez. Plus précisément, Graphics2D.drawImage (Image, AffineTransform) et AffineTransform.getRotateInstance. Vous pouvez également faire la mise à l'échelle, la traduction et le cisaillement avec cela. Les deux classes sont dans le runtime depuis au moins 1.4 probablement plus tôt.

  public Image rotateImage(Image img, float degrees){
   BufferedImage sourceBI = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_ARGB);
   sourceBI.getGraphics().drawImage(img,0,0,null);
   AffineTransform at = new AffineTransform();
   at.rotate(degrees*Math.PI/180, sourceBI.getWidth()/2, sourceBI.getHeight()/2);
   BufferedImageOp bio = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
   return bio.filter(sourceBI, null);
  }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top