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 |
|
|
| Encadrement (suite) | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Encadrement (suite) Sam 3 Avr 2021 - 17:38 | |
| D'un intérêt très limité, mais histoire de causer dans le calme ambiant... Découper des bordures arrondies autour d'une image, portrait, etc. Sous forme d'une sub, avec comme paramètres le fichier source (jpg, bmp), l'intensité de l'arrondi (avec des limites à ne pas franchir) et le fichier résultat (bmp). Pour blanchir les zones dégagées par l'arrondi, la sub fait appel à une fonction DLL de l'ami Klaus "FloodfillPictureToBorderColor": remplissage par une couleur donnée d'une zone délimitée par une couleur donnée. (On peut le faire en panoramic, pixel par pixel, mais c'est très long, trop long). - Code:
-
DIM f$,e,fr$ f$ = "C:\GRAPH\JPG\TailFine.jpg": ' 433 x 577 fr$ = "C:\TEMP\Image.bmp": ' fichier résultat bmp, chemin et nom à ajuster e = 30 Cadrarrondi(f$,e,fr$) HEIGHT 0,640 PICTURE 1: WIDTH 1,433: HEIGHT 1,577: FILE_LOAD 1,fr$ END ' ======================================================================= SUB Cadrarrondi(f$,e,fr$) ' Cadre à bords arrondis autour de f$ (bmp,jpg)-> fr$ (bmp) ' e = distance des nouveaux coins aux bords (pixels), ~30, à tester IF LABEL("Arco") = 0 THEN LABEL Arco IF LABEL("Remplir") = 0 THEN LABEL Remplir DIM_LOCAL fm$,p,w,h,x1,y1,x2,y2,xc,yc,sens,r,ha,d,a,a1,a2,cb,cr,res% fm$ = "C:\TEMP\Img.bmp": ' fichier de manoeuvre, temporaire p = 900: PICTURE p: HIDE p FILE_LOAD p,f$: FILE_SAVE p,fm$ FILEBIN_OPEN_READ 1,fm$ FILEBIN_POSITION 1,18: w = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: h = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1: FILE_DELETE fm$ WIDTH p,w: HEIGHT p,h 2D_TARGET_IS p: 2D_PEN_COLOR 254,254,254: cb = 65536*254+256*254+254 IF e = 0 THEN e = 30 DEGREES ' horizontales x1 = e: x2 = w-e: d = x2-x1: r = (e*e+d*d/4)/(2*e): ' rayon des courbures x1 = e: y1 = e: x2 = w-e: y2 = y1: sens = 1: GOSUB Arco x1 = e: y1 = h-e: x2 = w-e: y2 = y1: sens = 2: GOSUB Arco ' verticales y1 = e: y2 = h-e: d = y2-y1: r = (e*e+d*d/4)/(2*e): ' rayon des courbures x1 = e: y1 = e: x2 = x1: y2 = h-e: sens = 1: GOSUB Arco x1 = w-e: y1 = e: x2 = x1: y2 = h-e: sens = 2: GOSUB Arco cr = 65536*255+256*255+255: ' couleur remplissage extérieur DLL_ON "C:\PANORAMIC\KGF\KGF.dll" x1 = 2: y1 = 2: GOSUB Remplir: y1 = h-2: GOSUB Remplir x1 = w-2: y1 = 2: GOSUB Remplir: y1 = h-2: GOSUB Remplir DLL_OFF FILE_SAVE p,fr$ 2D_TARGET_IS 0: DELETE p EXIT_SUB Arco: ha = r-e d = SQR((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)): ' distance entre les points a = 2*ASIN(d/(2*r)): ' angle total de l'arc IF x2 > x1: ' y2 = y1: sens horizontal xc = x1+(x2-x1)/2: yc = y1+ha: a1 = 90+a/2 IF sens = 2 THEN yc = y1-ha: a1 = 270+a/2 ELSE : ' x2 = x1: sens vertical yc = y1+(y2-y1)/2: xc = x1+ha: a1 = 180+a/2 IF sens = 2 THEN xc = x1-ha: a1 = a/2 END_IF a2 = a1-a 2D_ARC xc,yc,r,a1,a2 RETURN Remplir: CLIPBOARD_COPY p res% = DLL_CALL0("LoadPicture"): ' image presse-papier -> image interne res% = DLL_CALL4("FloodfillPictureToBorderColor",x1,y1,cr,cb) res% = DLL_CALL0("SavePicture"): ' image interne -> presse-papier CLIPBOARD_PASTE p RETURN END_SUB ' ============================================================================ L'image finale a les mêmes dimensions que l'image d'origine, avec des parties effacées. Résultat, par exemple, pour arrondir les angles : Je précise que 1) l'image n'est pas truquée 2) je n'ai aucun intérêt dans le pub de Taillefine ! (comme on peut se douter). NB plus la valeur du paramètre e (distance des nouveaux coins à ceux d'origine) est élevée et plus les courbes seront prononcées. Il ne faut toutefois pas dépasser une certaine valeur sinon l'image sera effacée. A tester. | |
| | | Froggy One
Nombre de messages : 598 Date d'inscription : 06/01/2012
| Sujet: Re : Encadrement (suite) Dim 4 Avr 2021 - 18:39 | |
| Quelle modestie ! moi j'aime bien cet encadrement. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Encadrement (suite) Lun 5 Avr 2021 - 10:43 | |
| Bonjour Froggy, ne t'y fies pas trop, c'est peut-être de la fausse modestie... | |
| | | Froggy One
Nombre de messages : 598 Date d'inscription : 06/01/2012
| Sujet: Re: Encadrement (suite) Lun 5 Avr 2021 - 11:00 | |
| Salut JL35. Je n'y crois pas une seconde !!! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Encadrement (suite) Lun 5 Avr 2021 - 19:41 | |
| Sans compter que la publicité en question est visiblement très efficace ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Encadrement (suite) Lun 5 Avr 2021 - 20:39 | |
| Bonsoir jjn4, Alors tu aimes bien les formes arrondies... Attention, je parle bien des bords de l'image ci-dessus, et non d'autre chose ! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Encadrement (suite) Mar 6 Avr 2021 - 16:51 | |
| Ah oui, et la photo à arrondir est d'ailleurs bien travaillée, car pour être arrondie, alors là, elle est tout à fait arrondie ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Encadrement (suite) Mar 6 Avr 2021 - 17:27 | |
| Alors tu me rassures, on parle bien de la même chose ! L'arrondi sert aussi à écarter un peu les bords pour que tout tienne dans l'image... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Encadrement (suite) Jeu 8 Avr 2021 - 12:36 | |
| J'ai modifié un peu la sub ci-dessus - on peut moduler la couleur et l'épaisseur du cadre (1 à 20 pixels) - on ne fait plus appel à kgf.dll pour le remplissage, c'est un peu plus long mais supposrtable: - Code:
-
DIM f$,fr$,w,h,x,y,x1,y1,x2,y2,xc,yc,e,r,a1,a2,d,et,ct WIDTH 0,700: HEIGHT 0,800 PICTURE 1: TOP 1,0: LEFT 1,0: full_space 1
f$ = "C:\GRAPH\JPG\mat.jpg" fr$ = "Z:\Result.bmp" e = 30 et = 12: ' épaisseur trait (cadre) ct = 65536*128+256*64: ' couleur cadre marron Cadrarrondi(f$,fr$,e,et,ct) width 1,380: height 1,611 full_space 1: FILE_LOAD 1,fr$ END
SUB Cadrarrondi(f$,fr$,e,et,ct) ' Encadrement d'une image f$ par des arcs de cercle, résultat fr$ (bmp) ' e = distance des coins, et = épaisseur du trait (1 à 20) ' ct = couleur du trait (256*256*r+256*g+b) ' NB: l'image résultante a les mêmes dimensions que l'image d'origine DIM_LOCAL fm$,p,w,h,x,y,x1,y1,d,a,Ry,r,g,b,cr,cp fm$ = "Z:\Img.bmp": ' fichier de manoeuvre, temporaire p = 900: PICTURE p: HIDE p: FILE_LOAD p,f$: FILE_SAVE p,fm$ FILEBIN_OPEN_READ 1,fm$ FILEBIN_POSITION 1,18: w = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: h = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1: FILE_DELETE fm$ WIDTH p,w: HEIGHT p,h: 2D_TARGET_IS p r = INT(ct/65536): g = BIN_AND(ct,65280)/256: b = BIN_AND(ct,255) 2D_PEN_WIDTH et: 2D_PEN_COLOR r,g,b x = 0: y = 0 IF et>1 THEN w = w-et: h = h-et: x = x+et/2: y = y+et/2 x1 = x+e: y1 = y+e: ' points de rencontre dans les angles DEGREES ' Haut et bas d = (w-2*e)/2: Ry = (e*e+d*d)/(2*e): ' rayon haut et bas a = ASIN(d/Ry): ' 1/2 angle xc = x+w/2: yc = y+Ry: 2D_ARC xc,yc,Ry,90+a,90-a: ' en haut yc = y+h-Ry: 2D_ARC xc,yc,Ry,270+a,270-a: ' en bas ' Gauche et droite d = (h-2*e)/2: Ry = (e*e+d*d)/(2*e): ' rayon gauche et droite a = ASIN(d/Ry): ' 1/2 angle xc = x+Ry: yc = y+h/2: 2D_ARC xc,yc,Ry,180+a,180-a: ' à gauche xc = x+w-Ry: 2D_ARC xc,yc,Ry,a,0-a: ' à droite ' Remplissage des angles (blanc) IF et>1 THEN w = w+et: h = h+et 2D_PEN_COLOR 255,255,255: ' couleur de remplissage (blanc) FOR y1 = 0 TO h/2: ' pixel par pixel, mais asez rapide FOR x1 = 0 TO w/2 cp = 65536*COLOR_PIXEL_RED(p,x1,y1)+256*COLOR_PIXEL_GREEN(p,x1,y1) cp = cp+COLOR_PIXEL_BLUE(p,x1,y1): ' couleur du point IF cp = ct THEN EXIT_FOR: ' bord encadrement atteint 2D_POINT x1,y1: 2D_POINT w-x1-1,y1 2D_POINT x1,h-y1-1: 2D_POINT w-x1-1,h-y1-1 NEXT x1 NEXT y1 FILE_SAVE p,fr$: 2D_TARGET_IS 0: DELETE p END_SUB[code][/code] J'ai changé d'image témoin... | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Encadrement (suite) Jeu 8 Avr 2021 - 16:12 | |
| Ah oui, c'est beaucoup mieux !!!!!!!!!!!!!!!!!!!!!!! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Encadrement (suite) Jeu 8 Avr 2021 - 16:29 | |
| Merci jj, je sais bien que tu parles du cadre, évidemment, impensable pour moi de croire autre chose... et c'est vrai que c'est mieux ainsi... | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Encadrement (suite) Jeu 8 Avr 2021 - 19:51 | |
| Pour gagner en vitesse tu peux calculer la position des pixels des arcs et copy/paste ligne par ligne. Papydall (je crois bien que c'est lui) a posté un exemple de tracé d'arc avec les fonctions sin/cos. Voiçi un exemple avec des ondelettes à la place des arcs: - Code:
-
DIM f$,w,h,y,fm$,p,d
create_hide
' form de travail, caché form 111 ANTIBUG_CREATE_HIDE(111) :' pfff... command_target_is 111
' image f$ = "C:\Documents and Settings\Utilisateur\Bureau\" dir_change f$ f$="sepia.sept1895.jpg"
' obtenir la taille de l'image fm$ = "C:\Img.bmp": ' fichier de manoeuvre, temporaire p = 1: PICTURE p :' conteneur de l'image (caché!) FILE_LOAD p,f$: FILE_SAVE p,fm$ FILEBIN_OPEN_READ 1,fm$ FILEBIN_POSITION 1,18: w = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: h = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1: FILE_DELETE fm$
' dimensionner le form caché à la taille de l'image WIDTH 111,w: HEIGHT 111,h
' dimensionner le conteneur de l'image TOP 1,0: LEFT 1,0 WIDTH 1,w: HEIGHT 1,h FILE_LOAD 1,f$
' dimensionner le conteneur de travail PICTURE 2: TOP 2,0: LEFT 2,0 WIDTH 2,w: HEIGHT 2,h
' copier l'image ligne par ligne dans le conteneur de travail ' ajout d'un effet d'ondelettes degrees image 10 for y=0 to h d=int(10+(sin(y*5)*10)) :' créer les ondelettes ' 2d_target_is 1 2d_image_copy 10,(0 + d),y,(w - d),y+1 :' ondelettes ' 2d_target_is 2 2d_image_paste 10,(0 + d), y :' ondelettes next y
' exporter l'image dans le form 0 ' command_target_is 0 ' parent 2,0 ' delete 10 ' delete 111 :' ça ne marche pas, le picture 2 reste rattaché au form 111, et il disparait ici ' exporter l'image dans le form 0, dans un nouveau picture 2d_image_copy 10,0,0,WIDTH(2),HEIGHT(2) command_target_is 0 picture 3 : 2d_target_is 3 WIDTH 3,WIDTH(2): HEIGHT 3,HEIGHT(2) 2d_image_paste 10,0,0 show 3 ' delete 10 delete 111
create_show
WIDTH 0,WIDTH(3)+8: HEIGHT 0,HEIGHT(3)+34
END SUB ANTIBUG_CREATE_HIDE(object%) ' Le bug : en interne, les objets ne reçoivent pas les valeurs des commandes TOP et LEFT après un CREATE_HIDE ' Les objets enfants ne sont plus affectés si le bug est corrigé sur l'objet parent ' dim_local x,y,w x=left(object%) y=top(object%) w=width(object%) ' if object_type(object%)=7 border_hide object% end_if ' width object%,0 ' show object% ' left object%,0-screen_x*2 ' if object_type(object%)=7 border_normal object% end_if ' width object%,w ' hide object% ' left object%,x top object%,y END_SUB
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Encadrement (suite) Jeu 8 Avr 2021 - 21:33 | |
| Merci pour le tuyau silverman, mais ça me paraît bigrement compliqué pour ce que je fais...
En fait la lenteur relative de l'exécution est due au remplissage final en blanc des zones externes à l'encadrement, fait pixel par pixel, mais bon, c'est quelques secondes. J'avais utilisé précédemment une fonction Klaus de remplissage, très rapide, mais c'est un appel à une ressource externe pour un usage vraiment ponctuel.
Je regarde néanmoins ton exemple mais déjà ça bloque au début avec un répertoire inexistant ("C:\Documents and Settings\Utilisateur\Bureau\)...
PS Effectivement c'est intéressant, mais un peu trop complexe à intégrer dans ma petite sub... | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Encadrement (suite) Ven 9 Avr 2021 - 23:03 | |
| Merci du partage JL35 !
Bravo pour cette réalisation !
A la fin de ton code source, tu as deux balises "code" et "/code" parasites.
Bonne continuation ! | |
| | | Contenu sponsorisé
| Sujet: Re: Encadrement (suite) | |
| |
| | | | Encadrement (suite) | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |