Conversion d'un Bitmap en Tableau a 2 dimension

Signaler
Messages postés
31
Date d'inscription
lundi 6 juin 2005
Statut
Membre
Dernière intervention
2 octobre 2005
-
Messages postés
5
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
6 avril 2008
-
Bonjour,

j'aimerai savoir s'il est possible de convertir une image Bitmap, en un tableau à 2 dimension.

pouvoir regarder les pixels de mon image au coordonnée X et Y désiré ???



mes images sont en couleurs RGB.



merci d'avance

18 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
houla... je pige pas bien



tu veux faire quoi ?



si c'est juste connaitre la couleur d'un pixel pour un point donné, va faire un tour sur la méthode GetPixelde ton Bitmap

<hr>Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
Messages postés
31
Date d'inscription
lundi 6 juin 2005
Statut
Membre
Dernière intervention
2 octobre 2005

je besoin de convertir mon image bitmap en tableau à 2 entrée (X et
Y) afin de pouvoir appliquer des filtres pour un traitement d'image.




voila par ex le traitement que j'aimerai faire :


s'il existe une telle configuration autour du pixel central

( x est 0 ou 1)

0 x 1

0 1 1

0 x 1

alors le pixel central reste à 1, sinon il passe à 0.


voila pourquoi j'aimerai avoir un tableau, c'est a mon avis, plus simple a utiliser
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
le problème, c'est qu'un bitmap est déjà un tableau.

chaque point est accessible par ses coordonnées.



De plus... 0 ou 1... c'est pas très parlant.

<hr>Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Si tu veux un maximum de performance pour le traitement d'image il faut utilser les fonctions Bitmap.LockBits, Bitmap.UnlockBits et les pointeurs..
Messages postés
31
Date d'inscription
lundi 6 juin 2005
Statut
Membre
Dernière intervention
2 octobre 2005

en faite, j'ai besoin qu'a chaque couleur, regarder les pixels voisins, s'il sont oui ou non activer.

je m'explique

en Rouge 1, pas de rouge 0, X on s'en fout



0 X 1

0 1 1

0 X 1

dans ce cas, le pixel central reste activé, sinon on le "vire", il est désactivé. ce filtre est un filtre de squelettisation.



Je commence a essayer avec les lockbit, mais comment faite tu pour
remettre le pointeur de ton tableau de byte au début, car je doit faire
plusieur fois ce systéme, donc je doit passer plusieur fois dans
l'image.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
byte* pDebut = ( byte* )BitmapData.Scan0;
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
en fait ce que tu as besoin est tres simple, je fait cet exemple en admettant que tu connaisse deja les informations concernant ta bitmap (pour gagner du temps)

ton image est en 640x480 24bits

il faut que tu ouvre ton fichier bitmap, et que tu charge dans un tableau memoire chaques données, tu peux utiliser la strucutre Color qui existe deja dans le framework .NET

BinaryReader br = new BinaryReader(new StreamReader(ton_fichier_bmp).BaseStream);
Color[,] pixels = new Color[640, 480];
for (int y = 479; y >= 0; y--)
{
for (int x = 0; x < 640; x++)
{
pixels[x, y].R = br.ReadByte();
pixels[x, y].G = br.ReadByte();
pixels[x, y].B = br.ReadByte();
}
}
br.Close();

voila en gros c'est ce qui te faut, mais j'ai ecrit ca a l'arrache donc je suis pas sure de toutes les syntaxes, si ca compile pas, check les syntaxe exacte ou repost, et si ca compile mais que ca fonctionne pas, sache que le parsing depend de la taille de ton image (largeur non multiple de 4 entraine des problemes), si le codage des couleurs est different, ca change aussi, etc...

j'espere avoir pu t'aider
Messages postés
31
Date d'inscription
lundi 6 juin 2005
Statut
Membre
Dernière intervention
2 octobre 2005

Lors de la compilation, il me dit que

pixels[x,y].R c'est qu'en lecture, il n'y a pas méthode de modification
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
R, G, B sont des propriétés en lecture seulement..

Avec cette méthode tu as un tableau de pixels mais tu travailles avec une copie de ton image, pas sur l'originale :(
Messages postés
31
Date d'inscription
lundi 6 juin 2005
Statut
Membre
Dernière intervention
2 octobre 2005

euh, je comprend pas, car meme avec une copi de l'image, R G B seront tjrs en lecture seules ?????
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Avec "Bitmap.LockBits / Bitmap.UnlockBits" tu fixes le bitmap en mémoire et tu récupères le premier byte ( Scan0 ) pour travailler directement sur ton image avec les pointeurs, c'est la méthode la plus difficile mais c'est la plus performante, bon y'a aussi surement la possibilité de récupérer le handle du bitmap et de faire tout un micmac avec GDI32 mais la c'est vraiment pour compliquer les choses..

SebSeb42 lui a répondu à ta première question càd "Comment convertir une image dans un tableau à 2 dimensions", le souci c'est qu'avec cette méthode tu copies ton image dans un tableau mais donc tu ne travailles plus sur l'image directement.

Vi, R, G, B sont des proprietés de la structure Color definies comme ca:

public int R { get { return red; } }; // Pas de set ( lecture seulement ) !!

Tu peux créer ta propre structure:

public struct RGB
{
public int R;
public int G;
public int B;
}

Pratique pour les pointeurs:

RGB* pColor = ( RGB* )myBitmapData.Scan0;

red = pColor->R;
green = pColor->G;
blue = pColor->B;
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
"le souci c'est qu'avec cette méthode tu copies ton image dans un tableau mais donc tu ne travailles plus sur l'image directement"

et alors ? si il modifie pas ? et si il compte modifier, il n'as qu'a charger les 54 permiers octets du fichier bmp (le header) et ensuite si il modif il re-ecrit le buffer de 54 octets de header puis sont tableau de pixels modifier et c'est fini... je vois pas vraiment en quoi c'est un probleme de travailler avec une copie ?? de toute facon si il compte modifier son image il aura pas vraiment le choix, a moins de bricoler directement le fichier a ecraser les anciennes valeur par des nouvelles, mais c'est bien plus dangereux

pour le coup de la structure Color, effectivement c'est du readonly mais c'etais plus pour faire passer le concept. en effet soit tu re-ecrit ta propre structure RGB, soit tu fait

pixels[x, y] = new Color(br.ReadByte(), br.ReadByte(), br.ReadByte());
(
il y a plein d'autre maniere differente de faire, du genre\

byte[] rgb = new byte[3];
br.ReadBytes(rgb);
pixels[x, y] = new Color(rgb[0], rgb[1], rgb[2]);
)

voila
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
"de toute facon si il compte modifier son image il aura pas vraiment le choix, a moins de bricoler directement le fichier a ecraser les anciennes valeur par des nouvelles, mais c'est bien plus dangereux"

Il veut appliquer un filtre ! Un filtre ca s'applique en temps réel, on ne travaille pas sur un fichier mais sur une image chargée en memoire..
Messages postés
5
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
6 avril 2008

bonsoir , je veux convertir une image bitmap en tableau à deux dimension , mon image est en noir et blanc (silhouette); la matrice aura com valeur 1 si le point appartien à la silhouette 0 sinon , svp aidez moi c urgent
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
quel est le format de pixels de ton image ?
est-ce que c'est du monochrome ? 16 / 24 / 32 bits ?
Messages postés
5
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
6 avril 2008

oui , monochrome ( l'image est tte en noir su fond blanc ) svp aidez moi
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
J'avais compris que l'image est en noir et blanc, mais le format de pixel est important. Sache que tu peux faire du noir et blanc en 1 bpp indexe (monochrome, au sens "format" du terme) mais que tu peux aussi en faire en 32bpp, cependant la facon de lire ton fichier va etre completement differente.

Bon enfin pour ton cas je pense que tu devrais utiliser la fonction GetPixel de la class Bitmap (System.Drawing.Bitmap), ce n'est pas ce qu'il y a de plus performant, mais l'avantage c'est que tu n'aura pas a faire attention au format de pixels.
Fait une boucle de 0 a height (height la hauteur en pixel de ton image), dans cette boucle fait une autre boucle allant de 0 a width (width la largeur en pixel de ton image), et dans cette derniere boucle, tu appel la fonction GetPixel de ton instance de Bitmap en donnat les coordonnees x et y que tu obtient grace aux boucles. Ainsi tu obtiendra pour chaque iteration de boucle (chaque pixel) une instance d'une structure Color (System.Drawing.Color) et tu pourras determiner la couleur de ton point (noir ou blanc).

J'espere que j'ai ete assez claire pour que tu puisse t'en sortir tout seul.
Bon courage.
Messages postés
5
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
6 avril 2008

bjr , pour la fonction getPixel ça marche pas voilà l'erreur "aucune surcharge de la méthode getPixel" , j'ai compris ce ke tu viens de dire mé peux tu me donner un exemple pour mieux comprendre ? svp merci