Bon, il est 4h du mat, j'abandonne.
Le problème semblait pourtant simple, mais les voies du Java sont impénétrable.
Merci à tous ceux qui pourront m'aider
Je tente de réaliser une application assez simple (sisi), qui consiste à reconstituer une image à partir de plein de petits bouts.
Voici un exemple :
J'ai quelque chose qui marche très bien tant que mes données d'entrée sont rectangulaire.
Voici le code (pour information) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Iterator<BufferedImage> it = allImagesFullColor.iterator(); initFullColor(it.next()); while(it.hasNext()) { aggregateFullColor(it.next()); }Maintenant, je voudrais l'améliorer, et faire en sorte que cela marche aussi pour des morceaux non-rectangulaire, avec une couleur de transparence.
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 private void initFullColor(BufferedImage next) { resultFullColor = new BufferedImage(next.getWidth()*3,next.getHeight()*3,BufferedImage.TYPE_INT_RGB); Graphics2D graphics = resultFullColor.createGraphics(); graphics.drawImage(next,null,next.getWidth(),next.getHeight()); } private void aggregateFullColor(BufferedImage next) throws IOException { ImageSearcher ims = new ImageSearcher(); ims.setImageToSearchIn(resultFullColor); ims.setImageToSearch(next); double founded = ims.search(); if (founded>0.05) { Graphics2D graphics = resultFullColor.createGraphics(); graphics.drawImage(next, ims.getXforLastMaxFounded()-next.getWidth()/2, ims.getYforLastMaxFounded()-next.getHeight()/2,null); ImageIO.write(resultFullColor,"png",new File("c:\\map_aggregée.png")); } }
Quelque chose comme ceci :
Les zones noires correspondent à une couleur "transparente" de mon fichier d'entrée, c'est à dire qu'elles ne correspondent pas à une couleur que je dois garder sur mon fichier final, mais à une zone indéterminée.
La seule chose que j'ai à faire, c'est donc d'être capable d'imprimer une image sur une autre en utilisant le noir comme couleur de transparence.
Mais ce n'est pas simple du tout en Java.
Voici ce que j'ai essayé :
1. dans ma List, je remplace mes BufferedImage par des Image avec channel alpha, que j'obtiens ainsi
Sachant que j'ai défini :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 RGBImageFilter imf = new BlackToTransparentFilter(new Color(0,0,0)); ImageProducer source = bf.getSource(); ImageProducer ip = new FilteredImageSource(source, imf); Image imageFiltree = Toolkit.getDefaultToolkit().createImage(ip);
2. je déclare mon image finale avec un canal alpha:
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 private class BlackToTransparentFilter extends RGBImageFilter { public int markerRGB; public BlackToTransparentFilter(final Color color) { canFilterIndexColorModel = true; markerRGB = color.getRGB() | 0xFF000000; } public int filterRGB(int x, int y, int rgb) { if ( ( rgb | 0xFF000000 ) == markerRGB ) { return 0x00FFFFFF & rgb; } else { return rgb; } } }
Et je me dis que ça devrait suffire, mais non : il continue d'afficher le noir comme couleur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part resultFullColor = new BufferedImage(next.getWidth(null)*3,next.getHeight(null)*3,BufferedImage.TYPE_INT_ARGB);
En plus, je suis drôlement embétté pour débuger, car vu que le RGBFilter me force à utiliser des Image au lieu de BufferedImage, je ne sais plus les imprimer dans des fichiers pour voir où j'en suis.
Si quelqu'un peut m'aider, ce serait drôlement sympa.
Bonne nuit à tous.
Partager