astragoth66
Messages postés31Date d'inscriptionlundi 6 juin 2005StatutMembreDernière intervention 2 octobre 2005
-
27 juin 2005 à 14:28
cs_mara88
Messages postés5Date d'inscriptionmardi 18 mars 2008StatutMembreDerniè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é ???
astragoth66
Messages postés31Date d'inscriptionlundi 6 juin 2005StatutMembreDerniè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.
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 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...
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 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;
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 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]);
)
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 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..
cs_mara88
Messages postés5Date d'inscriptionmardi 18 mars 2008StatutMembreDerniè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
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 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.
cs_mara88
Messages postés5Date d'inscriptionmardi 18 mars 2008StatutMembreDerniè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