Conversion d'un Bitmap en Tableau a 2 dimension

astragoth66 Messages postés 31 Date d'inscription lundi 6 juin 2005 Statut Membre Dernière intervention 2 octobre 2005 - 27 juin 2005 à 14:28
cs_mara88 Messages postés 5 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 6 avril 2008 - 6 avril 2008 à 20:20
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

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
27 juin 2005 à 14:36
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
0
astragoth66 Messages postés 31 Date d'inscription lundi 6 juin 2005 Statut Membre Dernière intervention 2 octobre 2005
27 juin 2005 à 14:46
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
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
27 juin 2005 à 14:49
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
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
27 juin 2005 à 14:58
Si tu veux un maximum de performance pour le traitement d'image il faut utilser les fonctions Bitmap.LockBits, Bitmap.UnlockBits et les pointeurs..
0

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

Posez votre question
astragoth66 Messages postés 31 Date d'inscription lundi 6 juin 2005 Statut Membre Dernière intervention 2 octobre 2005
27 juin 2005 à 15:15
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.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
27 juin 2005 à 15:33
byte* pDebut = ( byte* )BitmapData.Scan0;
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
27 juin 2005 à 15:41
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
0
astragoth66 Messages postés 31 Date d'inscription lundi 6 juin 2005 Statut Membre Dernière intervention 2 octobre 2005
27 juin 2005 à 16:12
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
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
27 juin 2005 à 16:49
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 :(
0
astragoth66 Messages postés 31 Date d'inscription lundi 6 juin 2005 Statut Membre Dernière intervention 2 octobre 2005
27 juin 2005 à 22:39
euh, je comprend pas, car meme avec une copi de l'image, R G B seront tjrs en lecture seules ?????
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
28 juin 2005 à 00:10
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;
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
28 juin 2005 à 16:06
"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
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
28 juin 2005 à 17:21
"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..
0
cs_mara88 Messages postés 5 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 6 avril 2008
4 avril 2008 à 22:05
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
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
5 avril 2008 à 05:00
quel est le format de pixels de ton image ?
est-ce que c'est du monochrome ? 16 / 24 / 32 bits ?
0
cs_mara88 Messages postés 5 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 6 avril 2008
5 avril 2008 à 19:07
oui , monochrome ( l'image est tte en noir su fond blanc ) svp aidez moi
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
6 avril 2008 à 09:17
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.
0
cs_mara88 Messages postés 5 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 6 avril 2008
6 avril 2008 à 20:20
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
0
Rejoignez-nous