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 :

Graphics2D BufferedImage et couleur transparente


Sujet :

2D Java

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut 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 :

    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());
    }
    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"));
    	}
    }
    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 :


    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 : 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);
    Sachant que j'ai défini :
    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;
    		}
    	}
    }
    2. je déclare mon image finale avec un canal alpha:
    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);
    Et je me dis que ça devrait suffire, mais non : il continue d'afficher le noir comme couleur.

    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.
    Images attachées Images attachées    

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SWING][JAVA2D] définir le couleur transparente d'un PNG
    Par TreizeSegments dans le forum 2D
    Réponses: 16
    Dernier message: 03/08/2009, 10h39
  2. [100% GDI] DC avec une couleur transparente....
    Par cyber_N dans le forum MFC
    Réponses: 6
    Dernier message: 20/11/2005, 11h41
  3. DirectDraw7: Couleur transparente pas si transparente...
    Par Magus (Dave) dans le forum DirectX
    Réponses: 4
    Dernier message: 01/10/2002, 19h17

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