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 :

Optimisation d'un code utilisant des bufferedImage


Sujet :

2D Java

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2008
    Messages : 37
    Par défaut Optimisation d'un code utilisant des bufferedImage
    Bonjour,

    Je travaille actuellement avec des bufferedImage, cependant je n'ai pas eut l'occasion de les apprendre pendant ma formation scolaire (oui c'est moche). Du coup j'essaye un peu de m'en sortir au milieu de tout ça.

    En gros je voulais fusionner deux images, (merci au FAQ de développez.com ), j'ai réussit.

    Maintenant deuxième étape, j'ai une image qui sert de référence et l'autre d'entrée. La référence est en niveau de gris et l'entrée en couleur. J'ai voulu sur l'entrée en couleur lui ajouter en couche alpha son niveau de gris. En gros fusionné l'image en couleur et la même image mais en niveau de gris. Et enfin ce résultat le fusionner avec la référence.

    J'ai aussi réussit, j'ai le résultat souhaité, cependant cela reste lent et cela doit être calculé dynamiquement à la volée. Du coup ça rame quand même pas mal.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    newComposite = AlphaComposite.getInstance(AlphaComposite.SRC);
    newComposite2 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER);
     
    buffer_REFERENCE = ipC_Map.getBufferedImage();
     
    bufferINPUT = ipC_INPUT.getBufferedImage();
     
    buffer = new bufferedImage(buffer_REFERENCE.getWidth(),buffer_REFERENCE.getHeight(),BufferedImage.TYPE_INT_ARGB_PRE);
     
    bufferINPUT_Mask = new BufferedImage(bufferINPUT.getWidth(),bufferINPUT.getHeight(),BufferedImage.TYPE_INT_ARGB_PRE);
     
    	graphicsBufferINPUT = bufferINPUT_Mask.createGraphics();
     
    	graphicsBufferINPUT.setComposite(newComposite);
    	graphicsBufferINPUT.drawImage(bufferREFERENCE,0, 0,null);
     
    	graphicsBufferINPUT.dispose();
     
    	// calcul la composante alpha qui est le niveau de gris de l'image.
        	pixel = 0;
    	alpha = 0;
     
    	for (int x = 0; x < bufferINPUT.getWidth(); x++) {
    		for (int y = 0; y < bufferINPUT.getHeight(); y++) {
     
    			pixel = bufferINPUT_Mask.getRGB(x, y);
     
    			//Transform to grey level
    			alpha = ( ((pixel & 0xff0000) >> 16) + ((pixel & 0xff00) >> 8) + (pixel & 0xff)) / 3;
    			//Add alpha to the color
    			pixel = alpha << 24 | (pixel & 0xff0000) >> 16 << 16 | (pixel & 0xff00) >> 8 << 8 | pixel & 0xff;
     
    			bufferINPUT_Mask.setRGB(x, y, pixel);
    			}
    		}
     
    		//Create the graphics2D object of buffer 
    		graphicsBuffer = buffer.createGraphics();
     
    		graphicsBuffer.drawImage(buffer_REFERENCE,0, 0,null);
     
    		graphicsBuffer.setComposite(newComposite2);
     
    		graphicsBuffer.drawImage(bufferINPUT_Mask, 0,0, null);
    		graphicsBuffer.dispose();
    Je pense ne pas avoir utiliser de manière optimale les bufferedImage. D'après ce que j'ai put voire c'est la boucle qui calcule la composante alpha qui met le plus de temps.

    J'ai voulu explorer plusieurs pistes, mais avant de me lancer je souhaiterai savoir si ça vaut le coup ou pas.

    Pensez vous que de passer par un doublebuffer software ou hardware vaudrait le coup?

    Une autre piste pour calculer le niveau de gris et l'ajouter en composante alpha plus rapidement et de façon plus optimale?

    En vous remerciant, je vous souhaite une bonne journée.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    http://java.developpez.com/faq/gui/?page=graphique_general_images#GRAPHIQUE_IMAGE_compatibleImage

    Note : utiliser la variante avec 3 arguments et passer Transparency.Translucent.

    Pour le reste on ne sait pas trop ou se place ce code, nottament les allocations d'image qu'il faudrait eviter de faire a tout bout de champs.

    Ensuite de maniere generale tu peux aussi travailler sur un tableau d'int[largeur x hauteur] et composer les couleurs manuellement avec les valeurs r, g, b, a ; en general ca va beaucoup plus vite :

    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
     
    int c0 = color.getRGB();
    short a = (c0 >> 24) & 0xFF;
    short r = (c0 >> 16) & 0xFF;
    short g = (c0 >> 8) & 0xFF;
    short b = (c0 >> 0) & 0xFF;
     
    [...]
     
    int c1 = ((a & 0xFF) << 24) | ((r & 0xFF)  << 16 | ((g & 0xFF) << 8) | ((b & 0xFF) < 0);
    rgb[index] = c1;
     
    [...]
     
    image.setRGB(0, 0, width, height, rgb, 0, width);
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2008
    Messages : 37
    Par défaut
    Opla désolé, je repasse après un moment d'absence. On m'avait fait passé sur un autre problème. Donc me revoila sur mon soucis de fusion d'image à la volée.

    Pour le reste on ne sait pas trop ou se place ce code, nottament les allocations d'image qu'il faudrait eviter de faire a tout bout de champs.
    En fait ce code ce place dans un mouseDragged, à chaque drag de la souris sur une image on regarde le resultat de la fusion entre deux images. Et cela se fait en fonction de la position de la souris, et le tout en temps réel.

    utiliser la variante avec 3 arguments
    C'est à dire? Désolé je ne suis vraiment pas à l'aise avec les buffered images

    Je vais testé de composer les couleurs à la main.

Discussions similaires

  1. [MySQL] Optimisation de mon code utilisant simple xml
    Par heretik25 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 05/08/2011, 20h13
  2. [C#][code] Utilisation des interfaces
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 21
    Dernier message: 17/07/2006, 10h06
  3. Comment utiliser des instructions SSE2 dans un code c++?
    Par alexIsBack dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 22/02/2006, 19h10
  4. [C#][couleur]Utilisation des codes couleurs?
    Par bakonu dans le forum C#
    Réponses: 3
    Dernier message: 28/11/2005, 19h38
  5. [CR8.5] Utilisation des codes barre
    Par Robert dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/01/2005, 16h13

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