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 :

Optimiser la rotation d'une image


Sujet :

2D Java

  1. #1
    Membre confirmé Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Par défaut Optimiser la rotation d'une image
    Bonjour,

    Je souhaite optimiser ma méthode pour la rotation des images voyez vous dans mon code (que je partage avec vous) quelques choses de méchant ?

    Merci par avance.

    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
     
    	public BufferedImage rotation(BufferedImage bi, int degrees) {
    		degrees = degrees % 360;
    		if (degrees > 180)
    			degrees = 180 - degrees;
    		double angle = (degrees * Math.PI) / 180.0f;
    		if (angle == 0.0)
    			return bi;
    		// TODO une vrai rotation pour calculer la taille exacte de l'image
    		// après rotation
    		int sx = bi.getWidth();
    		int sy = bi.getHeight();
    		if (degrees == 90 || degrees == -90) {
    			sx = bi.getHeight();
    			sy = bi.getWidth();
    		}
    		BufferedImage rot = new BufferedImage(sx, sy, bi.getType());
    		AffineTransform at = new AffineTransform();
    		at.translate(sx / 2, sy / 2);
    		at.rotate(angle);
    		at.translate(-bi.getWidth() / 2, -bi.getHeight() / 2);
    		AffineTransformOp ato = new AffineTransformOp(at,
    				AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
    		return ato.filter(bi, rot);
    	}

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Utilise un tableau pour la conversion degré -> radian. Tu pré-calcul un tableau de 360 double.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Utilise un tableau pour la conversion degré -> radian. Tu pré-calcul un tableau de 360 double.
    Merci mais je n'ai pas bien compris.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Utilise un tableau pour la conversion degré -> radian. Tu pré-calcul un tableau de 360 double.
    Excellent, je suis plié pour le reste de la journée (indice quelle est le rapport de temps entre 1 multiplication et sx*sy applications d'un matrice 3x3?)

    Sérieusement, faudrais déjà voir ce que Alijava recherhe comme optimisation. Tu compte faire tourner une image en continu et tu veux pouvoir faire X rotations par secondes? Tu compte faire tourner de X degrés 50.000 images d'un coup? Pour voir comment tu peux optimiser, faudrait déjà qu'on aie un shéma type d'utilisation

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Excellent, je suis plié pour le reste de la journée (indice quelle est le rapport de temps entre 1 multiplication et sx*sy applications d'un matrice 3x3?)

    Eh ! T'es un peu gonflé de m'insulter ! Il veut de l'optimisation à tout prix, alors je lui donne le premier truc qui me saute aux yeux pour optimiser
    Précalculer, jusqu'à preuve du contraire, permet d'optimiser, même si ce n'est pas grand chose.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre confirmé Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Par défaut
    En effet, j'ai oublié de préciser qu'est ce que je veux en faire.
    J'ai un répertoire en entrée qui contient n images sauf que ces images ne sont pas droit.
    Pour que cela ne se voit pas dans mon projet il faut tout simplement les faire tourner avant de les afficher à l'utilisateur.
    C'est un livre, vous avez PAGE 1 / PAGE 2 donc deux panels qui affichent respectivement les images n et n-1 (à l'envers)

    Et avec ma méthode le temps de charger le répertoire qui contient les images du livre scanné prend beaucoup de temps avec la rotation (30/20 secondes) de même quand je fais avancer vers les pages (images) suivantes.

    voilou

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Alors l'optimisation la plus simple et la plus efficace dans ton cas, tu redresse toutes les pages une fois pour toutes et tu les sauves sur le disque une fois pour toute, comme çà plus de problème. Si ce sont des pages scannées, j'en conclue que t'as un truc du style 2500 pixels x 4500 pixels à tourner via une matrice, donc ton plus gros problème de perfs se situerais à l'application du filtre. Si t'as vraiment besoin de faire çà "au vol", tu peux peut etre regarder à faire de ta "page" une texture openGL et afficher un polygone opengl utilisant la page, polygone tourné de N degrés. Ca nécessite de passer par openGL evidement, mais tu délègue à la carte graphique, et pour ce que je connais des jeux vidéos, la carte graphique sais afficher plein de polygone dans plein d'orientations très vite.

    Autre optimisation possible, ajouter un scale à la matrice, l'appliquer sur le Graphics de l'écran, pour ne faire la rotation *que* pour les points visibles à l'écran de l'utilisateur (plus performant, mais moins réactif au niveau de l'interface peut etre)

    Vu le nombre de pixels impliqués, les opérations autres que l'application du filtre, dans ton cas, n'ont qu'un cout très limité et à peine perceptible. (pour la taille indiquée, le calcul matriciel devrait impliquer plus ou moins 112 millions d'opérations flottantes (en supposant 10 opérations par application de la matrice d'après la doc de affinetransform...)

    Pour dinobogan, je suis désolé, mais non, jusqu'à preuve du contraire, faire une addition d'un index avec vérification de ses limites, puis utiliser cet index pour rappatrier une donnée depuis une autre zone mémoire n'a aucune raison d'etre plus rapide qu'une multiplication au sein des registres de la jvm. De plus, comme tu sais pas sur quelle machine réelle tournera la jvm, tu peux pas en conclure sur les performances des accès mémoire par rapport au calculateur flottant.

  8. #8
    Membre confirmé Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Par défaut
    Merci pour ta réponse.

    En effet, avec OpenGl on peut optimiser largement les calculs mais ce n'est pas possible dans mon cas ou encore pourquoi ne pas le faire avec le shading pour faire mieux.
    OpenGl avec Java .. jamais fait et je ne veux pas m'aventurier la dessus (je pense pas que j'en ai besoin pour ce que j'ai envie de faire c'est une simple image).
    Là ce que je cherche est tout simplement une optimisation du temps de rotation sachant que la contrainte de le faire en Java n'est pas négociable.
    Donc si c'est possible de me guider par rapport à l'API classique Java 1.5 pour faire mieux ça sera bien aimable. Désolé de ne pas avoir dis cela puisque je pense que j'ai bien éviter le forum Algo.
    Ou sinon si quelqu'un à une autre idée pour contourner cela avec seul donnée Java 1.5 et sans biblio externes, je suis preneur.

    Un grand merci à tous (et à toutes ?).

    aa

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu affiche 2 pages à la fois? Si oui, tu peux peut être "précalculer" la page précédente et la page suivante, histoire de gagner en rapidité de l'interface (pas en perfs malheureusement), tu peux aussi faire plutot l'opération dans le paint() plutot que dans un bufferedimage (si l'image est grosse çà va évite de faire une belle occupation mémoire) d'un composant custom. Avantage, tu ne calcule que les pixels visible et pas toute l'images (imaginons un écrant 1024x768, ton calcul est limité à 790.000 pixels (je part toujours d'une image de départ beaucoup plus grande que l'écran)

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