Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Colorier une surface | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Colorier une surface Sam 22 Fév 2014 - 14:13 | |
| Je voulais remonter ce vieux topic de sergeauze: https://panoramic.1fr1.net/t871-colorier-une-sur-surface de 2010, qui n'a pas eu beaucoup de succès, mais il est verrouillé. J'avais le même problème: colorier une surface délimitée par une couleur donnée avec une couleur donnée, en partant d'un point situé à l'intérieur (sachant évidemment qu'il n'y a pas préalablement une couleur uniforme à l'intérieur, sinon le Flood ferait l'affaire). Sachant que cette surface peut avoir des contours tarabiscotés. Et je ne trouve pas de solution, même avec les fonctions images pourtant puissantes de la dll de klaus | |
| | | sergeauze
Nombre de messages : 391 Age : 72 Localisation : Hautes Alpes France Date d'inscription : 09/01/2010
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 14:54 | |
| Salut J'avais passé des heures dessus! et Jack a sorti 2_flood Il serait intéressant que tu soumettes un cas particulier et de voir comment on pourrait le résoudre (Une ébauche de code ou/et un capture d’écran) Je suis prêt à remettre ça ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 22 Fév 2014 - 15:01 | |
| @ JL35
Tu pars d' une image ou d' une forme dessinée avec les outils 2D ? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 15:43 | |
| Bonjour à tous,
@sergeauze 2_flood ? c'est quoi ça ? 2D_FLOOD oui, je connais et j'utilise, mais c'est pour remplir une surface qui ne contient qu'une seule couleur uniforme, dès qu'il rencontre une autre couleur que celle du point de départ il s'arrête. Il n'y a pas spécialement de cas particulier, et je n'ai aucune ébauche de code, je ne vois pas du tout comment procéder, même pixel par pixel, sans laisser des zones non traitées.
@ygeronimi Je parle d'une figure dessinée par-dessus une gravure ou une photo par exemple, un contour dessiné avec une couleur donnée, la fonction partirait d'un point situè à l'intérieur et remplirait tout ce qui est à l'intérieur avec une autre couleur donnée, jusqu'à rencontrer la couleur de bord. Pour la couleur de bord, il suffit de prendre une couleur qu'on a peu de chances de rencontrer à l'intérieur, du genre 1,1,1 ou quelque chose comme ça. Si c'est un rectangle ou un cercle, pas de problème, les fonctions 2D_Rectangle et 2D_Cercle peuvent remplir l'intérieur (avec 2D_Fill_Color), mais si c'est une figure quelconque, un losange, une ellipse, une étoile, n'importe quelle figure fermée, je ne sais pas faire.
Application pratique, entre autres: découper une figure dans une image pour y incruster une autre image avec une fonction d'incrustation de la dll l'ami Klaus. Je sais faire avec cercle ou rectangle (voir l'exemple dans 'Présentation et bavardage': passe-partout), mais pas avec autre chose.
PS je vois bien une solution très lourdingue, pour ne rien rater: - Balayer entièrement le picture pixel par pixel, du haut en bas. Dès qu'on rencontre la couleur de bordure, on modifie la couleur des pixels suivants jusqu'à rencontrer à nouveau la couleur de bordure, et on continue jusqu'au bout de la ligne, puis idem pour les lignes suivantes jusqu'en bas. Il faudra que j'essaie, mais il faut tester la couleur de tous les pixels, un par un (3 instructions à chaque fois), ça doit prendre un temps faramineux ! | |
| | | sergeauze
Nombre de messages : 391 Age : 72 Localisation : Hautes Alpes France Date d'inscription : 09/01/2010
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 16:08 | |
| C'est cette solution que j'avais adoptée Avec le nouveau compilateur ça met moins de temps Mais ça reste une usine à gaz | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 16:13 | |
| Je vais essayer, pour voir, mais je crains un temps d'exécution rédhibitoire. | |
| | | sergeauze
Nombre de messages : 391 Age : 72 Localisation : Hautes Alpes France Date d'inscription : 09/01/2010
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 16:34 | |
| | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 16:40 | |
| J'ai jeté un oeil sur le post en question, mais je n'y vois pas bien le code qui permettrait de remplir une surface... | |
| | | Invité Invité
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 16:49 | |
| Une simple idée (et encore) Si l'image à l'intérieur n fait pas plus de 200 pixels, tu peux faire des essais avec scene2d et sprite. Tu fais ton dessin avec un fond noir que tu sauvegardes. tu mets une scene2d et tu recharges l'image sprite avec sprite_file_load au format bmp. Une fois réglé, tu récupères l'image avec la fonction image. Peut-être travailler avec plusieurs SPRITE les uns à côté des autres si l'image est plus grande. C'est peut-être idiot ce que je dis, mais je l'ai dit (dans ce cas j'ai fait l'effort de le paraître) |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 17:04 | |
| C'est vrai que je ne pense jamais aux fonctions sprite, pas bête ce que tu dis cosmos, il faut que je regarde ça de plus près, idée intéressante. Là je suis en train de galérer avec les fonctions classiques et c'est plein de cas particuliers et ça boucle...
PS L'embêtant c'est qu'apparemment le sprite ça ne marche que sur un Scene_2d, or moi je travaille sur un Picture, et il semble bien qu'il n'y a pas de rapport... | |
| | | Invité Invité
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 17:26 | |
| Si avec image tu peux récupérer celle-ci, tu la sauvegardes ou copies, et tu changes scene2d par picture pour reprendre l'image. |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 18:20 | |
| Cosmos, si je reprends l'image depuis un Image dans un picture en x,y, je pense que je ne vais récupérer systématiquement qu'une image rectangulaire, et non pas un contour quelconque... Je n'ai pas fait comme ça mais tu m'as donné une idée, bien sûr c'est pixel par pixel, mais ça ne dépend que des dimensions de l'image à reporter, et non de celles du picture récepteur: je dessine ma fenêtre dans un picture auxiliaire (éventuellement provisoire), aux dimensions externes de cette fenêtre, puis je la reporte dans le picture principal: - Code:
-
DIM ra%,ga%,ba%,rf%,gf%,bf%,rt%,gt%,bt%,ct%,p1%,p2%,wf%,hf%,y% ra% = 254: ga% = 254: ba% = 254: ' couleur de tracé rf% = 255: gf% = 0: bf% = 0: ' couleur de remplissage rt% = 1: gt% = 1: bt% = 1: ' couleur de transparence
' Picture de base (receveur) p1% = 1 PICTURE p1%: TOP p1%,20: WIDTH p1%,320: HEIGHT p1%,240 COLOR p1%,0,0,255: ' fond bleu 2D_TARGET_IS p1%: 2D_PEN_COLOR 255,255,0: 2D_PEN_WIDTH 3 FOR y% = 0 TO HEIGHT(p1%) STEP 6: 2D_LINE 0,y%,WIDTH(p1%),y%: NEXT y%
' Fenêtre à reporter dans le picture de base (ici losange, par exemple) p2% = 100 wf% = 80: hf% = 120: ' dimensions hors tout de la figure à reporter PICTURE p2%: top p2%,20: left p2%,400: WIDTH p2%,wf%: HEIGHT p2%,hf%: ' HIDE p2% COLOR p2%,rt%,gt%,bt% 2D_TARGET_IS p2%: 2D_PEN_COLOR ra%,ga%,ba% 2D_LINE wf%/2,0,wf%,hf%/2: 2D_POLY_TO wf%/2,hf%: 2D_POLY_TO 0,hf%/2: 2D_POLY_TO wf%/2,0 2D_FLOOD wf%/2,hf%/2,rf%,gf%,bf% ct% = 65536*rt%+256*gt%+bt%: ' couleur de transparence
Copyfig(p2%,p1%,120,60,ct%)
print "Terminé !" END
SUB Copyfig(p2%,p1%,x%,y%,ct%) ' copie de la figure de p2% dans p1% en x,y ' Couleur de transparence ct% (format R*65536+G*256+B) DIM_LOCAL wf%,hf%,r%,g%,b%,rt%,gt%,bt%,x1%,y1% wf% = WIDTH(p2%): hf% = HEIGHT(p2%): ' image à transférer bt%=BIN_AND(ct%,255): gt%=BIN_AND(ct%/256,255): rt%=INT(ct%/65536): ' transparence 2D_TARGET_IS p1% FOR y1% = 0 TO hf%-1 FOR x1% = 0 TO wf%-1 r% = COLOR_PIXEL_RED(p2%,x1%,y1%): g% = COLOR_PIXEL_GREEN(p2%,x1%,y1%) b% = COLOR_PIXEL_BLUE(p2%,x1%,y1%) IF r%<>rt% AND g%<>gt% AND b%<>bt% 2D_PEN_COLOR r%,g%,b%: 2D_POINT x%+x1%,y%+y1% END_IF NEXT x1% display NEXT y1% END_SUB j'ai ajouté le display, sinon l'image disparaît pendant le traitement... C'est annexe, mais il y a quelque chose qui m'échappe complètement, jusqu'à la ligne 12: je colorie mon picture en bleu, j'y trace des lignes jaunes horizontales de 3 pixels tous les 6 pixels, et je me retrouve avec une image en noir et blanc... ??? | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 18:45 | |
| @JL35, essai avec 2D_PEN_WIDTH 4, les lignes jaunes sont plus visibles. Effet d'optique A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Colorier une surface Sam 22 Fév 2014 - 20:07 | |
| Tu as raison Jean Claude, c'est un effet d'optique, si on met width 8 et step 16 là tout est correct. En tout cas j'adopte la sub, ce n'est pas très rapide, mais ça me convient pour ce que je veux faire. Edit Une autre sub, la Sub Ellipse, qui permet de dessiner et de colorier une ellipse d'une couleur donnée sur un picture qui contient déjà n'importe quoi, c'est impossible à faire avec le 2D_Flood: - Code:
-
DIM ra%,ga%,ba%,rf%,gf%,bf%,rt%,gt%,bt%,ct%,p1%,p2%,wf%,hf%,y% ra% = 254: ga% = 254: ba% = 254: ' couleur de tracé rf% = 255: gf% = 0: bf% = 0: ' couleur de remplissage rt% = 1: gt% = 1: bt% = 1: ' couleur de transparence
COLOR 0,0,255,255 ' Picture de base (receveur) p1% = 1: p2% = 100 PICTURE p1%: TOP p1%,20: LEFT p1%,10: WIDTH p1%,320: HEIGHT p1%,240 COLOR p1%,0,0,255: ' fond bleu 2D_TARGET_IS p1%: 2D_PEN_COLOR 255,255,0: 2D_PEN_WIDTH 8 FOR y% = 0 TO HEIGHT(p1%) STEP 16: 2D_LINE 0,y%,WIDTH(p1%),y%: NEXT y%
Ellipse(p1%,50,50,200,100,255*256) END
SUB Copyfig(p2%,p1%,x%,y%,ct%) ' Insertion d'une figure de forme quelconque dans un picture. La figure à copier ' est dans un autre picture qui l'enveloppe, entourée d'une couleur 'transparente' ' Copie du picture p2% dans p1% en x,y, en ignorant les pixels 'transparents"' ' ct% = couleur de transparence ct% (format R*65536+G*256+B) DIM_LOCAL wf%,hf%,r%,g%,b%,rt%,gt%,bt%,x1%,y1% wf% = WIDTH(p2%): hf% = HEIGHT(p2%): ' image à transférer bt%=BIN_AND(ct%,255): gt%=BIN_AND(ct%/256,255): rt%=INT(ct%/65536): ' transparence 2D_TARGET_IS p1% FOR y1% = 0 TO hf%-1 FOR x1% = 0 TO wf%-1 r% = COLOR_PIXEL_RED(p2%,x1%,y1%): g% = COLOR_PIXEL_GREEN(p2%,x1%,y1%) b% = COLOR_PIXEL_BLUE(p2%,x1%,y1%) IF r%<>rt% AND g%<>gt% AND b%<>bt% 2D_PEN_COLOR r%,g%,b%: 2D_POINT x%+x1%,y%+y1% END_IF NEXT x1% display NEXT y1% END_SUB
SUB Ellipse(p%,x%,y%,w%,h%,coul%) ' Tracé d'une ellipse inscrite dans le rectangle x%,y%,w%,h%, dans l'objet p% ' Couleur de remplissage coul% (format R*65536+G*256+B) ou -1 si vide DIM_LOCAL xc%,yc%,ax%,ay%,xx%,yy%,r%,g%,b%,p1% ax%=w%/2: ay% = h%/2: xc% = x%+ax%: yc% = y%+ay%: ' 1/2 grands axes et centre 2D_TARGET_IS p% IF coul% <> -1 p1%=5000: WHILE OBJECT_EXISTS(p1%)=1: p1%=p1%+1: END_WHILE PICTURE p1%: LEFT p1%,-500: WIDTH p1%,w%: HEIGHT p1%,h%: HIDE p1% COLOR p1%,254,254,254: ' couleur de transparence xc% = ax%: yc% = ay% 2D_TARGET_IS p1%: 2D_PEN_COLOR 0,0,0 END_IF 2D_PEN_COLOR 0,0,0 ' tracé de l'ellipse FOR yy% = -1*ay% TO ay% xx% = (ax%*SQR(ay%*ay%-yy%*yy%))/ay% 2D_POINT xc%+xx%, yc%+yy% 2D_POINT xc%-xx%, yc%+yy% NEXT yy% FOR xx% = -1*ax% TO ax% yy% = (ay%*SQR(ax%*ax%-xx%*xx%))/ax% 2D_POINT xc%+xx%, yc%+yy% 2D_POINT xc%+xx%, yc%-yy% NEXT xx% IF coul% <> -1 ' transfert de p1% dans p% b%=BIN_AND(coul%,255): g%=BIN_AND(INT(coul%/256),255): r%=INT(coul%/65536) 2D_FLOOD xc%,yc%,r%,g%,b%: ' coloriage de l'ellipse 2D_TARGET_iS p% FOR yy% = 0 TO h%-1 FOR xx% = 0 TO w%-1 r% = COLOR_PIXEL_RED(p1%,xx%,yy%): g% = COLOR_PIXEL_GREEN(p1%,xx%,yy%) b% = COLOR_PIXEL_BLUE(p1%,xx%,yy%) IF r%<>254 AND g%<>254 AND b%<>254 2D_PEN_COLOR r%,g%,b%: 2D_POINT x%+xx%,y%+yy% END_IF NEXT xx% display NEXT yy% DELETE p1% END_IF END_SUB | |
| | | Contenu sponsorisé
| Sujet: Re: Colorier une surface | |
| |
| | | | Colorier une surface | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |