[java] Couleurs d'une image - déterminer les couleurs par pixel

Bonjour,
je voudrais obtenir chaque couleur par pixel d’une image que j’uploade.
J’ai utilisé 2 méthodes : une avec un bufferedImage et une autre avec le PixelGrabber, mais aucune des deux n’a l’air de marcher; car je n’obtiens pas les bonnes couleurs ( en entrée du N/B et ça m’affiche que j’ai du bleu ). Voici mon code, ce sera plus simple :


private int width;
    private int height;
    private Image myImage;
    private Object pixels;
    private int nbColors = 0;
    private ColorModel colorModelImage;
private String getTextOfPmbFromImgTest3(String pathImage){
        
        //On crée l'image à partir du path
        myImage = new ImageIcon(pathImage).getImage();
        
        //Remplit les données essentielles pour les pixels
        fillPixels();
        
        //Remplissage des lignes
        String textPmb = "debut";
        textPmb += width+"\n";
        textPmb += height+"\n";
        int indexPixel = 0;
        //valeur de la couleur 1 pour noir, 0 pour blanc
        int valueColor = 0; 
        for(int indexLigne=0;indexLigne<width;indexLigne++){
            valueColor = 0;
            for(int indexCol=0;indexCol<height;indexCol++){
                //convertit la couleur
                valueColor += getColor(indexPixel);
                indexPixel++;
            }
            textPmb += valueColor + "\n";
            System.out.println("indexLigne = "+indexLigne);
        }
        System.out.println("textPmb = "+textPmb);
        
        return textPmb;
    }

/**
     * Remplit les pixels
     *
     */
    private void fillPixels(){
        width = myImage.getWidth(this);
        height = myImage.getHeight(this);
        
        //on construit le grabber
        PixelGrabber pixelgrabber = new PixelGrabber(myImage,0,0,width,height,false);
        try {
            pixelgrabber.grabPixels();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        //Obtention des pixels
        pixels = (Object) pixelgrabber.getPixels();
        System.out.println("pixels.getClass() = "+pixels.getClass());
        colorModelImage = pixelgrabber.getColorModel();
        if(!(colorModelImage instanceof IndexColorModel)){
            System.out.println("ce n'est pas un fichier indexé ( ie ce n'est pas un gif");
        }
        else {
            nbColors = ((IndexColorModel)colorModelImage).getMapSize();
        }
        
    }

//donne la couleur avec la rouge, vert et bleu
 private int getColor(int pixel){
    int color =0;
    color = getRed(pixel) + getGreen(pixel) + getBlue(pixel);
    
    return color;
    }

//Couleurs RGB
    //vert
    private int getGreen(int pixel){
        if(colorModelImage instanceof IndexColorModel){
            return ((IndexColorModel)colorModelImage).getGreen(pixel);
        }
        else {
            return ((DirectColorModel) colorModelImage).getGreen(pixel);
        }
    }
    
    //rouge
    private int getRed(int pixel){
        if(colorModelImage instanceof IndexColorModel){
            return ((IndexColorModel)colorModelImage).getRed(pixel);
        }
        else {
            return ((DirectColorModel) colorModelImage).getRed(pixel);
        }
    }
    
    //bleu
    private int getBlue(int pixel){
        if(colorModelImage instanceof IndexColorModel){
            return ((IndexColorModel)colorModelImage).getBlue(pixel);
        }
        else {
            return ((DirectColorModel) colorModelImage).getBlue(pixel);
        }
    }
}

En entrée je lui mets une photo en N/B, je devrais n’avoir que du 0,0,0 et du 255,255,255 normalement, et en fait j’ai du 0,0,i pour i variant de 0 à widht*height

Est ce que je gère mal le tableau de pixels ?
Merci

Travaille sur une image en ARGB sur laquelle tu places ton image en N&B, et là, ça devrait marcher :wink:

merci,
mais c’est quoi une image ARGB ? J’ai pas trop compris ce que j’ai trouvé sur le net …
Mais sinon, je suis en train d’essayer une autre voix plus simple apparemment …
Mais j’ai une nouvelle question …
Comment faire un readLine() sur une image ?
j’ai utilisé un BufferedReader, mais ça ne marche pas.


 BufferedReader buffReader = new BufferedReader(new FileReader(pathImage));
 width = Integer.parseInt(buffReader.readLine()); // Là ça plante ...

Si tu (vous) as (avez ) une réponse au code précédent déjà … Ensuite j’essaierai le ARGB.
Merci en tous cas.

Ton convertisseur de couleur il fait n’importe quoi ? Non parceque ajouter les RVB ensemble tu vas atteindre des résultats de 0 à 255*3 sans compter que tu les ajoute avec les autres pixels de la ligne. Bref, il serait plus simple de récupérer une seul des couleurs (puisque dans une N/B R=V=B). Ensuite de la stocker dans ton String au niveau de ta boucle sur la collonne ( et non sur les lignes ).

Autre chose :

c’est une véritable N/B sans niveau de gris ?


//valeur de la couleur 1 pour noir, 0 pour blanc

j’ai oublié de l’effacer en postant le topic ( en fait à partir de la couleur obtenue, je calcule une valeur : 1 pour le noir, et 0 pour le blanc.

Et je suppose oui, que c’est un véritable N/B : je transforme ma photo avec infranview en faisant decrease colors depth -> 2 Colors(Black/White) donc c’est un vrai N/B.

Ensuite je veux bien récupérer une seule couleur, mais j’aurais soit tout le temps 0 si je choisis rouge ou vert, et si je choisi bleu, j’aurais 1,2,3, …

toujours pas avancé sur ARGB :’(

Au lieu de travailler sur myImage, essaie en travaillant sur srcImage, définie ainsi :

srcImage = new BufferedImage(myImage.getWidth(this), myImage.getHeight(this), BufferedImage.TYPE_INT_RGB);
srcImg.getGraphics().drawImage(myImage, 0, 0, this);

(Remplace BufferedImage.TYPE_INT_RGB par BufferedImage.TYPE_INT_ARGB, si tu veux jouer avec la transparence)

Tu devrais alors pouvoir jouer avec les composantes :wink:

– EDIT
Désolé, je viens de relire les précédents messages :
ARGB = Alpha, Red, Green, Blue
TYPE_INT_ARGB = Les 4 données, chacune sur 1 octet (= 8 bits), le tout dans un int
Alpha : (Val >> 24) & 0xFF (Décalage de 24 bits) - Ce que doit faire getAlpha(Val)
Composante rouge : (Val >> 16) & 0xFF - Ce que doit faire getRed(Val)
Composante verte : (Val >> 8) & 0xFF - Ce que doit faire getGreen(Val)
Composante bleue : Val & 0xFF - Ce que doit faire getBlue(Val)

Note sur l’Alpha (de mémoire) : 0 -> Opaque, 1 -> Complètement transparent, 255 -> Opaque (de 2 à 254, de plus en plus opaque)
Donc, par défaut, si on ne précise pas d’Alpha, c’est entièrement opaque

J’ai essayé et ça ne marche pas non plus … et tout ce qui est transparence, décalage de bits … je nage
Mais [myself] tu as l’air de maîtriser un max, alors je te dis tout :
En fait, y a sûrement un moyen plus simple … Mon but étant de transformer un fichier image en pmb (logos pour montre polar ), grosso modo je veux adapter un code php : cf ce site : http://www.martinet.nl/wp-site/polar-heart…e-monitor-logos
Je te laisse aussi le code de ce que j’ai fait : http://waveur.site.voila.fr/java/ConvertToPmb.java

J’espère que tu auras LA solution …
Merci

Après de bonnes recherches, ou je pataugeais un peu et les explications de ARGB ça a fini par marcher en utilisant ce simple code :


int pixel = buffImage.getRGB(x, y);
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
in blue = pixel & 0xff;

Comme ça les couleurs marchent!
Merci à tous en tous cas.