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 :

BufferedImage toute noire


Sujet :

2D Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut BufferedImage toute noire
    Bonjour,

    j'ai un problème assez bien résumé dans le titre de la discussion. Je sais que c'est très difficile de conseiller sans avoir le code sous les yeux, mais mon code se trouvant dans pas mal de classes, je vais essayer de m'expliquer sans .

    mon objectif est de créer une série de BufferedImage retravaillée à partir d'une image de mon disque.

    par étapes :

    1. chargement de l'image .jpg en 36*36 px- TestOk
    2. envoie de l'image dans une méthode.
    pour une série de tailles déterminées
    2.1 redimensionnement de l'image avec setRenderingHint( KEY_INTERPOLATION, VALUE_INTERPOLATION_NEAREST_NEIGHBOR).
    2.2 la valeur alpha de tout les pixels a l’extérieur d'un polygon passée a 0.
    2.3 dessin du même polygon (pour des question esthétique).

    Résultat :
    c'est la que c'est très étrange, sans modifier mon code le résultat varie,

    Cas 1 : toutes le images d'une dimension inférieure a celle de base (36*36) sont toutes noire.

    Cas 2 : toutes le images d'une dimension inférieure ou égale à celle de base (36*36) sont toutes noire.

    J'ai déjà fais pas mal de test pour essayer de cerner le problème, mais rien a faire je ne comprend pas .

    Si quelqu'un a une idée ou peux me donner des cas ou une image ressort noire afin de continuer mes tests, ce serais super .

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Le problème vient de ton code.
    Fait un programme simple reproduisant le problème. Il est même possible que tu trouves toi-même l'erreur en faisant ce petit exercice, certes casse-pied, mais qui peut te faire gagner du temps.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ben au pifomètre je dirait:
    1) le problème est que c'est dans plein de bouts de code donc y a surement quelque chose qui fait n'importe quoi
    2) quand je vois "2.2 la valeur alpha de tout les pixels a l’extérieur d'un polygon passée a 0" je suppose qu'en fait tu passe toute l'image et non pas le alpha mais toute la couleur à 0

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Bon, j'ai refais un p'tit programme qui récupère juste une image, je la fait passer dans ma méthode et affiche les images qui en résultent.
    le problème est presque le même mais mérite d’être précise :

    C'est la première image retournée qui pose problème, elle fait la bonne taille et le polygone est bien tracé. Mais elle est vide, comme si tout les pixels avaient une valeur alpha de 0. Pour les autres images, tout va bien.

    Le soucis vient manifestement de ma méthode.
    j'ai surement mal compris certain principe de base d’utilisation d'une ou plusieurs classes ou fait une erreur encore plus bête .

    Du coup je vous soumet le code.

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    public 	static 	Vector<BufferedImage> 	createZoomImg 	(Image aImgBase, int[] aListetaille, Color aCouleurContour)
    	{
    		Vector<BufferedImage> vectReturn	=	new Vector<BufferedImage> ();
    		for (int i = 0 ; i < aListetaille.length ; i++ )
    		{
    			int tailleCourante = aListetaille[i];
    			// redimention de l'image
    			BufferedImage 	newImage	=	OutilImage.scaleImage (aImgBase, tailleCourante, tailleCourante);
     
    			int 			taXFimg		=	(int) ((Math.sqrt ((Math.pow (tailleCourante/2, 2)- Math.pow (tailleCourante/4, 2))))*2);
    			int 			taYFimg		=	tailleCourante;
    			int 			p0xFimg		=	(tailleCourante - taXFimg)/2;
    			int 			p0yFimg		=	0;
    			BufferedImage 	intImage	=	newImage.getSubimage (p0xFimg, p0yFimg, taXFimg, taYFimg);
     
    			// retaillage selon le polygone
    			Polygon			poly		=	OutilMap.getHexa (tailleCourante, new Point (0, 0));
     
    			int x = 0;
    			int y = 0;
    			while(x < intImage.getWidth ())
    			{
    				while (y < intImage.getHeight ())
    				{
    					Color couleurPixel = new Color (intImage.getRGB (x, y));
     
    					if (!poly.contains (x, y) || (couleurPixel.getBlue () == 255 && couleurPixel.getGreen () == 255 && couleurPixel.getRed () == 255 ))
    					{
    						intImage.setRGB (x, y, new Color (couleurPixel.getRed (), couleurPixel.getGreen (), couleurPixel.getBlue (), 0).getRGB ());
    					}
    					y	++;
    				}
    				x ++ ;
    				y = 0;
    			}
    			// traçage d'un polygone pour le contour
    			Graphics2D g = intImage.createGraphics ();
    			g.setColor (aCouleurContour);
    			g.drawPolygon (poly);
    			g.dispose ();
     
    			vectReturn.add (intImage);
    		}
    		return vectReturn;
    	}
     
    	public 	static 	BufferedImage			scaleImage 		(Image source, int width, int height)
    	{
    		BufferedImage 	img 	= new BufferedImage (width, height, BufferedImage.TYPE_INT_ARGB);
    		Graphics2D 		g 		= (Graphics2D) img.getGraphics ();
    		g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
    		g.drawImage (source, 0, 0, width, height, null);
    		g.dispose ();
    		return img;
    	}
    Sachant que :
    - la liste des tailles est 12,24,36,48,60
    - la méthode getHexa renvoie bien ce qui est prévu, cad un hexagone de la bonne taille.

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    J'imagine que ton polygone n'est pas correct : il est en dehors de l'image ou est minuscule par rapport à l'image.
    Ajoute un compteur à l'endroit ou tu mets alpha=0 dans le but de compter les pixels modifiés, puis compare au nombre de pixels de ton image.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    J'ai suivis tes conseils, mais c'est toujours pas ça, pour chaque taille il supprime un nombre cohérent de pixels. genre pour une taille de 12, il en passe 30 à alpha = 0.

    J'ai continué de chercher de mon coter, quelle que soient les tailles ou le nombres d'images, la ou les premières images retournées sont vident.

    Pour tout dire j’espérais presque que quelqu'un trouverais une bête erreur d'algorithmie .

    Le plus louche, c'est que si je refait la même méthode toutes les images sont correct. et le nombre d'image vident est différent lorsque l'image est différente.
    Du coup, je pense a un problème d'initialisation de l'image ou en tout cas de son Graphics.

    pour charger l'image je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Image img1 =	Toolkit.getDefaultToolkit ().createImage ("C:\\img\\testH.jpg");
    Je ne connais pas d'autre methode pour charger une image. Un p'tit conseil?

    J'y comprend vraiment plus rien...

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Bon ben c'était ça, en chargeant mes imagez avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new ImageIcon ("img\\testV.jpg").getImage ()
    tous ce passe bien .

    Merci a vous .

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Si je comprends bien, le but de cette boucle:
    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
     
    			while(x < intImage.getWidth ())
    			{
    				while (y < intImage.getHeight ())
    				{
    					Color couleurPixel = new Color (intImage.getRGB (x, y));
     
    					if (!poly.contains (x, y) || (couleurPixel.getBlue () == 255 && couleurPixel.getGreen () == 255 && couleurPixel.getRed () == 255 ))
    					{
    						intImage.setRGB (x, y, new Color (couleurPixel.getRed (), couleurPixel.getGreen (), couleurPixel.getBlue (), 0).getRGB ());
    					}
    					y	++;
    				}
    				x ++ ;
    				y = 0;
    			}
    C'est de retirer le blanc et trouer le polygone? Et on sait que le polygon est correct car il se dessine bien lors de l'appel àDeux questions
    1) si tu retire la version "12" dans le tableau des tailles, est-ce que ça deviens la version 24 qui est incorrecte
    2) Quelle est la valeur de retour de g.drawImage (source, 0, 0, width, height, null); ? Ca retourne un booléen qui doit être true si le travail a pu être fait.

    Aussi, tu devrais revoir la javadoc. Il est marqué que la méthode drawImage retourne immédiatement, même si le Graphic n'a pas encore été mis à jour. Tu devrais passer ta propre instance de ImageObserver à cette méthode pour savoir quand l'image est complètement dessinée. Pour presque sur, tu commencer à lire l'image "redimensionnée" alors que la méthode drawImage n'a encore rien écrit dessus.

    Edit: et au vu de ton message entre deux, drawImage n'avais pas fini, simplement parce que createImage n'avais pas fini de charger l'image.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Ok je vais faire ca, merci

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

Discussions similaires

  1. [GD] image redimensionnée toute noire
    Par lachouke dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 21/07/2008, 16h38
  2. [GD] Ma miniature est toute noire !?!?
    Par dutbas dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 05/07/2007, 07h43
  3. [ImageMagick] Captcha crytographp image toute noire
    Par vodasan dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/02/2007, 07h35
  4. Réponses: 5
    Dernier message: 24/10/2006, 11h41
  5. [GD] Obtention aléatoire d'un message d'erreur et l'image enregistrée est toute noire
    Par maty2006 dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 30/05/2006, 10h14

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