Image Gray depuis tableau pixel

vdougnac Messages postés 13 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 2 mai 2007 - 30 mars 2007 à 11:41
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 31 mars 2007 à 23:48
Bonjour,

Je souhaiterai créer une image à partir d'un tableau de bytes codant la valeur de chaque pixel, puis l'afficher dans une interface graphique.
J'ai vu qu'il fallait utliser la classe image et lui fournir le tableau de pixel.
byte[] tableauPixels;
...
Image image = createImage(new MemoryImageSource(taille.width, taille.height,tableauPixels, 0, taille.width));

Mon problème est que mon tableau est de type byte et non de type int comme attendue par la fonction.

Comment est'il possible de faire cela ?

Merci!

6 réponses

Belette32 Messages postés 57 Date d'inscription mercredi 14 septembre 2005 Statut Membre Dernière intervention 22 novembre 2007
30 mars 2007 à 13:16
slt, as-tu essayé de créer un second tableau de type int dans lequel tu reprends et convertis toutes les données du tableau précédents au format integer? Il me semble que ce serait la solution la plus rapide à ton problème. Belette32
0
vdougnac Messages postés 13 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 2 mai 2007
30 mars 2007 à 13:21
Salut,

Oui j'ai converti mon tableau de byte en int mais ensuite, vaut'il mieux creer une image Image ouu buffuredImage ?
Comment afficher l'image en niveau de gris dans une fenêtre ?
Je débute en Java...

Merci!
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
30 mars 2007 à 23:02
Salut:

Tu peux passer d'un tableau de type byte [] en un tableau de type int [],
en combinant les cases de ton tableau de bytes 3 à 3 pour obtenir en équivalent RGB.

Si je ne me trompe pas trois bytes successives de ce tableau de byte [] représentent:
- niveau du rouge (R)
- niveau du vert  (G)
- niveau du bleu  (B)

//
// Calculer la valeur RGB en fonction du niveau du rouge, vert, bleu
//
int getRGB (byte red, byte green, byte blue) {
    return (int)(red | green << 8 | blue << 16);
}

Bonne chance


________________________________________________________________________________
A.B. : 
"Dieu nous donne des mains, mais il ne bâtit pas les ponts"
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
31 mars 2007 à 11:10
Salut,

Petite correction du code ci-dessus qui permet de s'assurer que le compilot n'effectura pas les décalages sur des byte mais sur des int :
int getRGB (byte red, byte green, byte blue) {
    return ((int)red | (int)green << 8 | (int)blue << 16);
}

si ton impage contient des pixels transparent pense à les préserver sinon voici le changement d'un pixel en noir et blanc :

public int getPrixelAndTranslateToGray(byte bRed, byte bGreen, byte bBlue){
    //pour s'assurer que les calculs se feront bien sur 32bits au lieu de 8
    int iRed = (int)bRed;
    int iGreen = (int)bGreen;
    int iBlue = (int)bBlue;
    int moy = ((iRed + iGreen + iBlue) / 3);
    return (moy << 16) + (moy << 8) + (moy);
}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vdougnac Messages postés 13 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 2 mai 2007
31 mars 2007 à 23:00
Bonjour,

Merci pour votre aide.
Mon tableau de byte[] code les valeurs des pixels en niveaux de gris, chaque valeur de pixel est sur 1 byte.
C'est donc la fonction inverse à getPrixelAndTranslateToGray que vous décrivez dont j'aurais besoin.
J'ai trouvé une parade consistant à affecter à la transparence de l'image (4ème octet de l'int codant la valeur du pixel) par 255 - la valeur contenu dans le tableau de byte[].
soit:
public int byteGrayToIntGray(byte bGray){
    return ( 255 - ((int)(bGray) << 24) );
}

Cela donne l'image en niveau de gris, mais je me demande si c'est vraiment la bonne méthode car en principe le niveau de gris ne devrait pas être associé à la transparence, non ?
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
31 mars 2007 à 23:48
Salut:

Twinuts >> c'est vrai, je n'avais pas fait attention au type. Avec mon code on va perdre des bits.


________________________________________________________________________________
A.B. : 
"Dieu nous donne des mains, mais il ne bâtit pas les ponts
0
Rejoignez-nous