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.