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 :

Problème de BufferedImage


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut Problème de BufferedImage
    Bonjour,

    je souhaitais faire quelques tests avec les bufferedImage, lorsque j'ai rencontré un problème que je n'explique pas.

    J'ai tout d'abord créé des image en dégradé (la valeur d'un pixel est sa position dans l'image) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static BufferedImage CreerBufferedImage(int w, int h)
    	{
    	int x ;
    	int hauteur = h ;
    	int largeur = w ;
    	int[] pixels = new int[largeur*hauteur] ;
    	BufferedImage buffer = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_BYTE_GRAY) ;
    	for (x=0 ; x < pixels.length ; x++) pixels[x] = x ;
    	buffer.setRGB(0, 0, largeur, hauteur, pixels, 0, largeur) ;
    	return buffer ;
    	}
    Mais lorsque j'ai appelé ma fonction pour une taille de 300*300, je n'ai pas eu le dégradé attendu :

    Je pensais qu'arrivé à 65536, la valeur des pixel repartirait à zéro. C'est bien le cas, mais le dégradé n'est pas continu.

    Mais lorsque j'appelle pour 256*256, le dégradé est correct :


    Questions :
    - Pourquoi ce problème ?
    - Comment faire pour convertir mes valeurs entre 0..255 vers BufferedImage.TYPE_BYTE_GRAY, car multiplier par un coefficient de type 65536/255 ne fonctionne pas

    Merci
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Dans ton tableau, tu mets des valeurs exprimées en RGB. Les premieres valeurs sont :
    0x00000000
    0x00000001
    0x00000002
    ...
    0x000000FF
    ...

    Ton objet BufferedImage etant de type TYPE_BYTE_GRAY, les seules couleurs disponibles dans la palette sont du genre :
    0x00000000
    0x00010101
    0x00020202
    ..
    0x00FFFFFF

    A priori les 256 premiers pixels (de 0x00000000 à 0x000000FF) vont donc avoir comme approximation 0x00000000

    Comme les changements se font tous les 256 couleurs, si ton image fait 256 couleurs de large, tu auras l'impression d'un gradient correct.
    Avec une image de largeur 300, tu verras les approximations, qui vont se produire sur la ligne.

  3. #3
    Invité
    Invité(e)
    Par défaut
    salut,
    puisque les couleurs vont de 0 à 256 une image de taille 256*256 donnera una dégradé idéale.
    mais pour une image 300 *300 tu as dépassé les 256 en ligne et en colonne ce qui explique la discontinuation du dégradé si j'ai bien raison. essaye avec une image 256*300 et 300*256 je crois que ça va beaucoup s'améliorer.
    bon je pense.
    tu peut amélirer ton code en essayant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    à la ligne i
    pour i = 0 ; i < ligne
    pour j = 0 ; j < colonne
    pixel(i,j) = i;
    tu n'as pas besoin à chaque fois de déterminer la valeur de pixel, les pixels d'une seule ligne auront une seule valeur qui est la valeur de aligne.

  4. #4
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Sanguko
    ... Avec une image de largeur 300, tu verras les approximations, qui vont se produire sur la ligne.
    L'oeil,a priori, n'étant sensible au maximum qu'à 64 nuances de gris, visuellement, tu ne devrais pas voir de saut.

    Cordialement.

    Pierre

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Enfin bon, pour faire un dégradé en java, tu as quand même les GradientPaint (+LinearGradientPaint et RadialGradientPaint depuis java 6) qui sont là pour çà.

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    BOnjour,

    merci pour ces réponses.

    Mais ce que je souhaiterai vraiement savoir c'est comment convertir mon tableau de pixels 0..255 pour que les couleurs s'affichent correctement dans une BufferedImage.

    J'ai essayé de réhausser de la façon suivante, mais ça reste toujours plus sombre que l'original :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BufferedImage buffer = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_USHORT_GRAY/*TYPE_BYTE_GRAY*/) ;
    	for (x=0 ; x < pixels.length ; x++) pixels[x] = 256*(pixels[x]+1)-1 ;
    	buffer.setRGB(0, 0, largeur, hauteur, pixels, 0, largeur) ;
    Merci...
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Voila ce qu'il faut faire pour obtenir une valeur rgb en fonction du niveau de gris (entre 0 et 255):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int getRGBFromLevel(int level) {
       return 0xFF000000 | level<<16) | (level<<8) | (level);
    }
    Pour du noir (level=0), le retour vaut : 0xFF000000
    Pour du blanc (level=255), le retour vaut : 0xFFFFFFFF

    NB : de facon rigoureuse, il faudrait passer par le ColorModel du BufferedImage pour rechercher les bonnes couleurs.

Discussions similaires

  1. Réponses: 22
    Dernier message: 21/08/2009, 01h13
  2. problème d'affichage de BufferedImage
    Par dsryam dans le forum Débuter
    Réponses: 7
    Dernier message: 12/03/2009, 22h43
  3. Réponses: 4
    Dernier message: 06/12/2006, 10h29
  4. [Jnlp] Problème avec FileSaveService et une BufferedImage
    Par Frac10 dans le forum Général Java
    Réponses: 4
    Dernier message: 22/06/2006, 12h25
  5. Réponses: 2
    Dernier message: 01/06/2006, 16h19

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