3 pièce(s) jointe(s)
Graphics2D BufferedImage et couleur transparente
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 : http://www.developpez.net/forums/att...1&d=1240282534
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:
1 2 3 4 5 6
| Iterator<BufferedImage> it = allImagesFullColor.iterator();
initFullColor(it.next());
while(it.hasNext())
{
aggregateFullColor(it.next());
} |
Code:
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"));
}
} |
Maintenant, je voudrais l'améliorer, et faire en sorte que cela marche aussi pour des morceaux non-rectangulaire, avec une couleur de transparence.
Quelque chose comme ceci :
http://www.developpez.net/forums/att...1&d=1240282760
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
Code:
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); |
Sachant que j'ai défini :
Code:
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;
}
}
} |
2. je déclare mon image finale avec un canal alpha:
Code:
resultFullColor = new BufferedImage(next.getWidth(null)*3,next.getHeight(null)*3,BufferedImage.TYPE_INT_ARGB);
Et je me dis que ça devrait suffire, mais non : il continue d'afficher le noir comme couleur.
http://www.developpez.net/forums/att...1&d=1240283572
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.