FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» PanExpress : l'éditeur Panoramic avec création d'objet
par Marc Aujourd'hui à 1:24

» Demande pour Jack concernant PanExpress
par Marc Hier à 23:56

» Calculatrice
par joeeee2017 Hier à 9:35

» EPP_V01 éditeur pour Panoramic
par Jean Claude Hier à 8:51

» Planétarium virtuel.
par Jean Claude Lun 17 Sep 2018 - 18:14

» Petit coucou en passant !
par Minibug Dim 16 Sep 2018 - 15:03

» bug SEVERE fnc+sub : variables globales corrompus
par silverman Dim 16 Sep 2018 - 13:38

» Verrouiller un form en avant plan
par silverman Dim 16 Sep 2018 - 12:50

» Fin de l'aventure.
par Pedro Alvarez Sam 15 Sep 2018 - 18:16

» Demande d'explications Sur File_Write & File_writeln
par Jack Sam 15 Sep 2018 - 17:26

» MEMO avec des possibilités de commande
par Oscaribout Mer 12 Sep 2018 - 1:06

» La théorie du chaos
par jean_debord Mar 11 Sep 2018 - 9:30

» Orbites de l’ensemble de Mandelbrot
par Jean Claude Lun 10 Sep 2018 - 21:08

» Version instantanée V 0.9.29i2 du 4/09/2018
par silverman Mer 5 Sep 2018 - 10:15

» Plantage lors de l'exécution de EXIT_SUB
par Jack Lun 3 Sep 2018 - 18:59

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Septembre 2018
LunMarMerJeuVenSamDim
     12
3456789
10111213141516
17181920212223
24252627282930
CalendrierCalendrier

Partagez | 
 

 Découpe dans une image

Aller en bas 
AuteurMessage
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Découpe dans une image   Mer 21 Fév 2018 - 23:45

Pour découper une forme dans une image (photo), isoler une partie dans une forme géométrique, par exemple un visage
(une image de fond qui ne tient pas dans l'écran sera automatiquement redimensionnée).
La zone définie est encadrée d'un trait d'épaisseur et de couleur réglables, et le reste de l'image (l'extérieur de l'encadrement) est peint en blanc uniforme.
Les figures d'encadrement prévues sont: un triangle équilatéral, un rectangle (ou carré), une ellipse (ou cercle), une étoile à 5 branches.

On définit:
- la forme de la découpe
- la couleur et l'épaisseur du tracé de contour
- les dimensions, largeur et hauteur de l'enveloppe extérieure de la figure (largeur seule = diamètre pour le triangle et l'étoile).
Puis on clique dans l'image à l'emplacement du centre de la figure (qui est symétrique);
On a un droit à l'erreur (bouton 'Annuler') pour faire une autre tentative.

On peut enregistrer le résultat que l'on pourra ensuite découper et redimensionner dans un logiciel classique.
J'ai utilisé KGF.dll pour sa fonction de remplissage d'une figure (Sub Remplir).


Code:
' Découpage d'une zone à contour géométrique dans une image
LABEL Chfig,Chc,Figures,Imgfn,Scrol,Des1,Rempl,Rempl1,Deplac,Annul,Enr,Enr1,Aide
DIM bh%,bv%,het%,p%,i%,j%,k%,x1%,y1%,x2%,y2%,r%,g%,b%,cb%,cr%,res%,fig%,t
DIM wt%,wc%,wn%,hn%,wi%,hi%,f$,fs$,a$,ri%,rx%,ry%,xc%,yc%,xr%,yr%,nbr%,x%(100),y%(100)
DIM rc$,subac%,wp%,hp%,sh%,sv%,ims%,xp%,yp%,es%
fs$ = "Z:\Convbmp.bmp"
BORDER_SMALL 0: bh% = WIDTH(0)-WIDTH_CLIENT(0): bv% = HEIGHT(0)-HEIGHT_CLIENT(0)
wc% = 640: ' largeur container
WIDTH 0,wc%+bh%: HEIGHT 0,650: COLOR 0,64,255,255: FONT_BOLD 0: FONT_NAME 0,"Arial"

het% = 100: ' hauteur de l'en-tête (containeer)
CONTAINER 1: WIDTH 1,wc%: HEIGHT 1,het%
ALPHA 2: PARENT 2,1: TOP 2,3: CAPTION 2," Image de fond : ": COLOR 2,255,255,0
EDIT 3: PARENT 3,1: TOP 3,TOP(2)+16: WIDTH 3,260: ON_CLICK 3,Imgfn
OPEN_DIALOG 4: FILTER 4,"Image JPG,BMP|*.jpg;*.bmp"
ALPHA 5: PARENT 5,1: TOP 5,TOP(3)+25: LEFT 5,5: CAPTION 5," Figure de découpe : "
  COLOR 5,255,255,0
i% = 40: j% = 36: k% = i%/2
PICTURE 10: PARENT 10,1: TOP 10,TOP(5)+15: LEFT 10,5: WIDTH 10,i%: HEIGHT 10,j%
PICTURE 11: PARENT 11,1: TOP 11,TOP(10): LEFT 11,LEFT(10)+i%+5: WIDTH 11,i%: HEIGHT 11,j%
PICTURE 12: PARENT 12,1: TOP 12,TOP(10): LEFT 12,LEFT(11)+i%+5: WIDTH 12,i%: HEIGHT 12,j%
PICTURE 13: PARENT 13,1: TOP 13,TOP(10): LEFT 13,LEFT(12)+i%+5: WIDTH 13,i%: HEIGHT 13,j%
FOR k% = 10 TO 13: ON_CLICK k%,Chfig: NEXT k%
EDIT 14: PARENT 14,1: TOP 14,TOP(13)-16: LEFT 14,LEFT(13): WIDTH 14,20: HEIGHT 14,15
  FONT_SIZE 14,8: TEXT 14,"5": nbr% = 5: ' étoile à 5 branches
ALPHA 15: PARENT 15,1: TOP 15,TOP(14)+2: LEFT 15,LEFT(14)+21: COLOR 15,255,255,0: CAPTION 15,"br. "
fig% = 3: GOSUB Figures

CONTAINER 20: PARENT 20,1: TOP 20,0: LEFT 20,WIDTH(3)+10: WIDTH 20,146: HEIGHT 20,het%-4
  CAPTION 20,"TRACÉ :": COLOR 20,180,255,255
ALPHA 21: PARENT 21,20: TOP 21,15: LEFT 21,2: CAPTION 21,"Couleur:"
PICTURE 22: PARENT 22,20: TOP 22,TOP(21)+15: LEFT 22,6: WIDTH 22,40: HEIGHT 22,22
  COLOR 22,255,0,0
PICTURE 23: PARENT 23,20: TOP 23,TOP(21)-2: LEFT 23,54: WIDTH 23,90: HEIGHT 23,40
  ON_CLICK 23,Chc
ALPHA 24: PARENT 24,20: TOP 24,TOP(22)+26: LEFT 24,5: CAPTION 24,"Épaisseur trait:"
SPIN 25: PARENT 25,20: TOP 25,TOP(24)-2: LEFT 25,LEFT(24)+90: WIDTH 25,50
  MIN 25,1: MAX 25,20: POSITION 25,1
BUTTON 26: PARENT 26,20: TOP 26,HEIGHT(20)-23: LEFT 26,8: HEIGHT 26,22: CAPTION 26,"Tracer": ON_CLICK 26,Des1
  i% = 23: j% = WIDTH(i%)/3: k% = HEIGHT(i%)/2: 2D_TARGET_IS i%
  2D_FILL_COLOR 0,0,0: 2D_RECTANGLE 0,0,j%,k%: 2D_FILL_COLOR 255,255,255: 2D_RECTANGLE j%,0,2*j%,k%
  2D_FILL_COLOR 0,0,255: 2D_RECTANGLE 2*j%,0,3*j%,k%: 2D_FILL_COLOR 0,255,0: 2D_RECTANGLE 0,k%,j%,2*k%
  2D_FILL_COLOR 255,0,0: 2D_RECTANGLE j%,k%,2*j%,2*k%: 2D_FILL_COLOR 255,255,0: 2D_RECTANGLE 2*j%,k%,3*j%,2*k%
PICTURE 27: PARENT 27,20: TOP 27,TOP(26)+6: LEFT 27,LEFT(26)+77: WIDTH 27,14: HEIGHT 27,14
  COLOR 27,255,0,0

CONTAINER 40: PARENT 40,1: TOP 40,0: LEFT 40,LEFT(20)+WIDTH(20)+2: WIDTH 40,75
  HEIGHT 40,HEIGHT(20): COLOR 40,180,255,255: CAPTION 40,"DÉPLACER:"
BUTTON 41: PARENT 41,40: TOP 41,15: LEFT 41,8: WIDTH 41,30: HEIGHT 41,18: CAPTION 41,CHR$(217)
BUTTON 42: PARENT 42,40: TOP 42,TOP(41): LEFT 42,LEFT(41)+WIDTH(41)+2: WIDTH 42,WIDTH(41)
  HEIGHT 42,HEIGHT(41): CAPTION 42,CHR$(218)
BUTTON 43: PARENT 43,40: TOP 43,TOP(41)+HEIGHT(41): LEFT 43,8: WIDTH 43,WIDTH(41): HEIGHT 43,HEIGHT(41)
  CAPTION 43,CHR$(219)
BUTTON 44: PARENT 44,40: TOP 44,TOP(43): LEFT 44,LEFT(42): WIDTH 44,WIDTH(41): HEIGHT 44,HEIGHT(41)
  CAPTION 44,CHR$(220)
BUTTON 45: PARENT 45,40: TOP 45,TOP(43)+HEIGHT(41): LEFT 45,8: WIDTH 45,WIDTH(41): HEIGHT 45,HEIGHT(41)
  CAPTION 45,CHR$(222)
BUTTON 46: PARENT 46,40: TOP 46,TOP(45): LEFT 46,LEFT(42): WIDTH 46,WIDTH(41): HEIGHT 46,HEIGHT(41)
  CAPTION 46,CHR$(223)
FOR i% = 41 TO 46
  FONT_NAME i%,"Wingdings 3": FONT_SIZE i%,10: ON_CLICK i%,Deplac
NEXT i%
SPIN 48: PARENT 48,40: TOP 48,TOP(46)+HEIGHT(46): WIDTH 48,48: LEFT 48,5: POSITION 48,5
  FONT_SIZE 48,10
ALPHA 49: PARENT 49,40: TOP 49,TOP(48)+3: LEFT 49,LEFT(48)+WIDTH(48): CAPTION 49,"pix."

CONTAINER 30: PARENT 30,1: TOP 30,0: LEFT 30,LEFT(40)+WIDTH(40)+2: WIDTH 30,WIDTH(20)
  HEIGHT 30,HEIGHT(20): COLOR 30,180,255,255
  CAPTION 30,"REMPLISSAGE :"
ALPHA 31: PARENT 31,30: TOP 31,15: LEFT 31,2: CAPTION 31,"Couleur:"
PICTURE 32: PARENT 32,30: TOP 32,TOP(31)+15: LEFT 32,6: WIDTH 32,40: HEIGHT 32,22
PICTURE 33: PARENT 33,30: TOP 33,TOP(31)-2: LEFT 33,54: WIDTH 33,90: HEIGHT 33,40
  ON_CLICK 33,Chc
  i% = 33: j% = WIDTH(i%)/3: k% = HEIGHT(i%)/2: 2D_TARGET_IS i%
  2D_FILL_COLOR 0,0,0: 2D_RECTANGLE 0,0,j%,k%: 2D_FILL_COLOR 255,255,255: 2D_RECTANGLE j%,0,2*j%,k%
  2D_FILL_COLOR 0,0,255: 2D_RECTANGLE 2*j%,0,3*j%,k%: 2D_FILL_COLOR 0,255,0: 2D_RECTANGLE 0,k%,j%,2*k%
  2D_FILL_COLOR 255,0,0: 2D_RECTANGLE j%,k%,2*j%,2*k%: 2D_FILL_COLOR 255,255,0: 2D_RECTANGLE 2*j%,k%,3*j%,2*k%
BUTTON 36: PARENT 36,30: TOP 36,HEIGHT(30)-23: LEFT 36,8: HEIGHT 36,22: CAPTION 36,"Remplir": ON_CLICK 36,Rempl

BUTTON 38: PARENT 38,30: TOP 38,HEIGHT(30)-36: WIDTH 38,20: LEFT 38,WIDTH(30)-22: HEIGHT 38,35: CAPTION 38,"?"
  FONT_SIZE 38,10: ON_CLICK 38,Aide

BUTTON 50: PARENT 50,1: TOP 50,TOP(3)+26: LEFT 50,WIDTH(3)-75: CAPTION 50,"Annuler": ON_CLICK 50,Annul
BUTTON 51: PARENT 51,1: TOP 51,TOP(50)+28: LEFT 51,LEFT(50): CAPTION 51,"Enregistrer": ON_CLICK 51,Enr
SAVE_DIALOG 52: FILTER 52,"Fichier BMP|*.bmp"

FORM 53: BORDER_HIDE 53: HIDE 53: TOP 53,TOP(1)+TOP(51)+50: LEFT 53,LEFT(1)+LEFT(51)
  WIDTH 53,160: HEIGHT 53,80 : COLOR 53,255,255,0: FONT_BOLD 53: FONT_NAME 53,"Arial"
CONTAINER_OPTION 54: PARENT 54,53: FULL_SPACE 54
OPTION 55: PARENT 55,54: TOP 55,10: LEFT 55,5: WIDTH 55,150
  CAPTION 55,"Enregistrer la découpe"
OPTION 56: PARENT 56,54: TOP 56,TOP(55)+18: LEFT 56,LEFT(55): CAPTION 56,"Enregistrer tout"
BUTTON 57: PARENT 57,53: TOP 57,HEIGHT(53)-30: LEFT 57,30: WIDTH 57,100: CAPTION 57,"Enregistrer"
  ON_CLICK 57,Enr1

p% = 60: wp% = 640: hp% = 480
PICTURE p%: TOP p%,het%: WIDTH p%,wp%: HEIGHT p%,hp%: 2D_TARGET_IS p%
sh%=p%+1: SCROLL_BAR sh%: TOP sh%,TOP(p%)+hp%: LEFT sh%,LEFT(p%): WIDTH sh%,wp%
          ON_CHANGE sh%,Scrol
sv%=sh%+1: SCROLL_BAR sv%: VERTICAL sv%: TOP sv%,TOP(p%): LEFT sv%,LEFT(p%)+wp%: HEIGHT sv%,hp%
          ON_CHANGE sv%,Scrol
          HIDE sh%: HIDE sv%
ims%=sv%+1: IMAGE ims%
IMAGE 99
END
' ==============================================================================
Chfig:
  ' Choix du type de découpe
  k% = NUMBER_CLICK: fig% = k%-8: ' type de figure cliqué (2 à 5)
  GOSUB Figures
RETURN
' ==============================================================================
Chc:
  k% = NUMBER_CLICK
  i% = MOUSE_X_LEFT_DOWN(k%): j% = MOUSE_Y_LEFT_DOWN(k%)
  r%=COLOR_PIXEL_RED(k%,i%,j%): g%=COLOR_PIXEL_GREEN(k%,i%,j%): b%=COLOR_PIXEL_BLUE(k%,i%,j%)
  COLOR k%-1,r%,g%,b%
RETURN
' ==============================================================================
Figures:
  i% = 40: j% = 36
  FOR k% = 10 TO 13
    2D_TARGET_IS k%: CLS: COLOR k%,255,255,180
    2D_PEN_WIDTH 2: 2D_PEN_COLOR 0,0,0
    2D_FILL_OFF
    SELECT k%
        CASE 10: 2D_POLY_FROM 6,29: 2D_POLY_TO i%/2,7: 2D_POLY_TO 35,29: 2D_POLY_TO 6,29
        CASE 11: 2D_RECTANGLE 6,8,35,30
        CASE 12: Ellipse(6,8,28,20)
        CASE 13: Etoile(i%/2,j%/2,5,(j%-6)/2,-1)
    END_SELECT
  NEXT k%
  2D_TARGET_IS fig%+8: 2D_FILL_OFF: 2D_PEN_WIDTH 3: 2D_PEN_COLOR 255,0,0
  2D_RECTANGLE 1,1,i%-1,j%-1
RETURN
' ==============================================================================
Imgfn:
  ' Choix de l'image de fond
  f$ = FILE_NAME$(4): a$ = UPPER$(FILE_EXTRACT_EXTENSION$(f$))
  IF a$ <> ".BMP" AND a$ <> ".JPG"
      MESSAGE "Uniquement BMP ou JPG !": RETURN
  END_IF
  TEXT 3,f$
  IF a$ = ".JPG"
      FILE_LOAD p%,f$: FILE_SAVE p%,fs$: f$ = fs$
  END_IF
  FILEBIN_OPEN_READ 1,f$
      FILEBIN_POSITION 1,18: wi% = FILEBIN_READ(1)+256*FILEBIN_READ(1)
      FILEBIN_POSITION 1,22: hi% = FILEBIN_READ(1)+256*FILEBIN_READ(1)
  FILEBIN_CLOSE 1
  wp% = wi%: hp% = hi%: es% = 17
  IF hp% > (SCREEN_Y-bv%-het%-30)
      hp% = SCREEN_Y-bv%-het%-30-es%: ' scroll_bar verticale
      SHOW sv%: MIN sv%,0: MAX sv%,hi%-hp%: POSITION sv%,0
  END_IF
  HEIGHT 0,hp%+het%+es%+bv%
  IF wp% > (SCREEN_X-bh%)
      wp% = SCREEN_X-bh%-17: ' scroll_bar horizontale
      SHOW sh%: MIN sh%,0: MAX sh%,wi%-wp%: POSITION sh%,0
  END_IF
  WIDTH 0,wp%+bh%+es%: IF WIDTH(0)<(wc%+bh%) THEN WIDTH 0,wc%+bh%
  WIDTH p%,wp%: HEIGHT p%,hp%
  IF HIDE(sh%) = 0 THEN TOP sh%,TOP(p%)+hp%: LEFT sh%,LEFT(p%): WIDTH sh%,wp%
  IF HIDE(sv%) = 0 THEN TOP sv%,TOP(p%): LEFT sv%,LEFT(p%)+wp%: HEIGHT sv%,hp%
  FILE_LOAD p%,f$
  CAPTION 2," Image de fond  =  "+STR$(wi%)+" x "+STR$(hi%)+" pixels "
  FILE_SAVE p%,fs$: ' sauvegarde de l'image de fond
' ============================================
Scrol:
  ' Déplacement des curseurs
  xp% = 0: yp% = 0
  IF HIDE(sh%) = 0 THEN xp% = POSITION(sh%): ' horizontal
  IF HIDE(sv%) = 0 THEN yp% = POSITION(sv%): ' vertical
  2D_TARGET_IS p%: FILE_LOAD ims%,f$: 2D_IMAGE_PASTE ims%,0-xp%,0-yp%
RETURN
' ==============================================================================
Des1:
  IF subac% = 1 THEN RETURN
  2D_TARGET_IS p%
  2D_IMAGE_COPY 99,0,0,WIDTH(p%),HEIGHT(p%): ' sauvegarde préalable
  wt% = POSITION(25): 2D_PEN_WIDTH wt%: ' largeur tracé
  r%=COLOR_PIXEL_RED(22,5,5): g%=COLOR_PIXEL_GREEN(22,5,5): b%=COLOR_PIXEL_BLUE(22,5,5)
  2D_PEN_COLOR r%,g%,b%: ' couleur tracé
  nbr% = VAL(TEXT$(14)): IF nbr%<2 THEN nbr%=2: TEXT 14,STR$(nbr%)
  COLOR 27,0,255,0: ' feu rouge
  Tracer(p%,fig%)
  COLOR 27,255,0,0: ' feu vert
RETURN
' ==============================================================================
Rempl:
  ON_CLICK p%,Rempl1
RETURN
Rempl1:
  r%=COLOR_PIXEL_RED(22,5,5): g%=COLOR_PIXEL_GREEN(22,5,5): b%=COLOR_PIXEL_BLUE(22,5,5)
  cb% = 65536*b%+256*g%+r%: ' couleur de trait (bordure)
  r%=COLOR_PIXEL_RED(32,5,5): g%=COLOR_PIXEL_GREEN(32,5,5): b%=COLOR_PIXEL_BLUE(32,5,5)
  cr% = 65536*b%+256*g%+r%: ' couleur de remplissage
  xr% = MOUSE_X_POSITION(p%): yr% = MOUSE_Y_POSITION(p%)
  2D_IMAGE_COPY 99,0,0,WIDTH(p%),HEIGHT(p%): ' image -> presse-papier
  DLL_ON "C:\PANORAMIC\KGF\KGF.dll"
    CLIPBOARD_COPY p%
    IF cr% = -1 THEN cr% = 65536*255+256*255+255: ' blanc
    res% = DLL_CALL0("LoadPicture"): ' image presse-papier -> image interne
    res% = DLL_CALL4("FloodfillPictureToBorderColor",xr%,yr%,cr%,cb%)
    res% = DLL_CALL0("SavePicture"): ' image interne -> presse-papier
    CLIPBOARD_PASTE p%
  DLL_OFF
  OFF_CLICK p%
RETURN
' ==============================================================================
Deplac:
  i% = NUMBER_CLICK
  j% = POSITION(48)
  SELECT i%
      CASE 41: x1% = x1%-j%: x2% = x2%-j%: ' gauche
      CASE 42: x1% = x1%+j%: x2% = x2%+j%: ' droite
      CASE 43: y2% = y2%-j%: y1% = y1%-j%: ' haut
      CASE 44: y1% = y1%+j%: y2% = y2%+j%: ' bas
      CASE 45: y1% = y1%-j%: x2% = x2%+j%: ' agrandir
      CASE 46: y1% = y1%+j%: x2% = x2%-j%: ' réduire
  END_SELECT
  2D_IMAGE_PASTE 99,0,0: ' restore image initiale
          rx%=(x2%-x1%)/2: ry%=(y2%-y1%)/2: xc%=x1%+rx%: yc%=y1%+ry%
          SELECT fig%
              CASE 1: 2D_LINE x1%,y1%,x2%,y2%: ' Trait
              CASE 2: 2D_POLY_FROM x1%,y2%: 2D_POLY_TO xc%,y1%: ' Triangle
                      2D_POLY_TO x2%,y2%: 2D_POLY_TO x1%,y2%
              CASE 3: 2D_RECTANGLE x1%,y1%,x2%,y2%: ' Rectangle
              CASE 4: 2D_POLY_FROM xc%+rx%,yc%: ' Ellipse
                      FOR t = 0 TO 2*pi STEP pi/180
                          2D_POLY_TO xc%+rx%*COS(t),yc%+ry%*SIN(t)
                      NEXT t
              CASE 5: ' nbr% = 5: ' étoile à 5 branches (défini plus haut)
                      ri% = rx%/2.62: ' branches supérieures horizontales
                      t = PI/2
                      FOR i% = 0 TO 2*nbr%-2 STEP 2
                          x%(i%) = xc%+rx%*COS(t): y%(i%) = yc%-rx%*SIN(t)
                          t = t+2*(PI/nbr%)
                      NEXT i%
                      t = PI/2 + PI/nbr%
                      FOR i% = 1 TO 2*nbr%-1 STEP 2
                          x%(i%) = xc%+ri%*COS(t): y%(i%) = yc%-ri%*SIN(t)
                          t = t+2*PI/nbr%
                      NEXT i%
                      2D_POLY_FROM x%(0),y%(0)
                      FOR i% = 1 TO nbr%*2-1: 2D_POLY_TO x%(i%),y%(i%): NEXT i%
                      2D_POLY_TO x%(0),y%(0)
          END_SELECT
RETURN
' ==============================================================================
Annul:
  2D_IMAGE_PASTE 99,0,0: ' restore
RETURN
' ==============================================================================
Enr:
  SHOW 53: TO_FOREGROUND 53
  MARK_ON 55
RETURN
Enr1:
  ' Enregistrer le résultat
  a$ = FILE_NAME$(52)
  2D_TARGET_IS p%
  IF CHECKED(55) = 1: ' enregistrer la découpe
      j% = wt%/2
      2D_IMAGE_COPY 99,x1%-j%,y1%-j%,x2%+j%,y2%+j%
      FILE_SAVE 99,a$
  ELSE: ' enregistrer toute l'image
      FILE_SAVE p%,a$
  END_IF
  HIDE 53
RETURN
' ==============================================================================
Aide:
  rc$ = CHR$(13)+CHR$(10)
  a$ = "  -  DÉCOUPE  DANS  UNE  IMAGE  -"+rc$+rc$
  a$=a$+"Encadrement d'une partie d'image (par exemple un visage) avec une figure"+rc$
  a$=a$+"géométrique, et remplissage en blanc de toute la zone extérieure à cette figure."+rc$+rc$
  a$=a$+"1) Choisir une image de fond jpg ou bmp (clic)"+rc$
  a$=a$+"    Si l'image ne tient pas dans l'écran, il y aura apparition de boutons de"++rc$
  a$=a$+"    boutons de défilement pour la parcourir."+rc$
  a$=a$+"2) Choisir une figure d'encadrement (triangle, rectangle, ellipse, étoile)."+rc$
  a$=a$+"    On peut fixer le nombre de branches de l'étoile (au-dessus du symbole)."+rc$
  a$=a$+"3) Choisir la couleur du tracé, et l'épaisseur du trait de contour."+rc$
  a$=a$+"4) Cliquer le bouton 'Tracer' -> le petit voyant à droite passe au vert (sinon,"+rc$
  a$=a$+"    recliquer)."+rc$
  a$=a$+"5) Cliquer dans l'image le coin supérieur gauche de la découpe, puis sans"+rc$
  a$=a$+"    relâcher, déplacer la souris vers le coin inférieur droit, puis relâcher."+rc$
  a$=a$+"    -> la zone sélectionnée est entourée par la figure choisie."+rc$
  a$=a$+"- On peut déplacer la sélection dans les 4 directions d'un nombre de pixels choisi"+rc$
  a$=a$+"    (boutons flèches horizontales et verticales) ou l'agrandir ou la réduire (boutons"+rc$
  a$=a$+"    flèches obliques)."+rc$
  a$=a$+"6) Remplissage: couleur uniforme (en général blanc) sur la totalité de l'image"+rc$
  a$=a$+"    autour de la découpe (ou à l'intérieur, selon ce qu'on veut en faire)"+rc$
  a$=a$+"    Choisir la couleur de remplissage, cliquer le bouton 'Remplir', puis cliquer"+rc$
  a$=a$+"    dans l'image un point de la zone à remplir."+rc$+rc$
  a$=a$+"- On peut annuler (bouton 'Annuler') et recommencer la dernière opération"+rc$
  a$=a$+"  (tracé ou remplissage) autant de fois que nécessaire."+rc$+rc$
  a$=a$+"Une fois le résultat désiré obtenu, on peut enregistrer l'image résultante au"+rc$
  a$=a$+"format bmp (bouton 'Enregistrer')."+rc$
  a$=a$+"On a le choix d'enregistrer soit la totalité de l'image (qui sera aux dimensions"+rc$
  a$=a$+"de l'image affichée), soit uniquement la découpe."+rc$
  a$=a$+"On peut imaginer d'insérer cette découpe par exemple dans des cartes de voeux,"+rc$
  a$=a$+"anniversaires, etc."+rc$
  MESSAGE a$
RETURN
' ==============================================================================
SUB Tracer(p%,fig%)
  ' Tracer une figure fig% à la souris sur le picture p%
  ' Figure vide, tracée avec les paramètres actuels: largeur trait, couleur
  ' Résultat dans x1%,y1%,x2%,y2%
  ' Figures: 1= Trait, 2= Rectangle, 3= Cercle/Ellipse, 4= Étoile à nbr% branches
  subac% = 1
  DIM_LOCAL im%,xs%,ys%,xc%,yc%,rx%,ry%,t,i%,j%,x%(100),y%(100),ri%
  im% = 900: IMAGE im%
  WHILE MOUSE_LEFT_DOWN(p%) = 0: PAUSE 100: END_WHILE
  x1% = MOUSE_X_POSITION(p%): y1% = MOUSE_Y_POSITION(p%)
  2D_TARGET_IS p%: 2D_FILL_OFF
  2D_IMAGE_COPY im%,0,0,WIDTH(p%),HEIGHT(p%)
  WHILE MOUSE_LEFT_UP(p%) = 0
      x2% = MOUSE_X_POSITION(p%): y2% = MOUSE_Y_POSITION(p%)
      IF x2%<>xs% OR y2%<>ys%
          xs%=x2%: ys%=y2%
          2D_IMAGE_PASTE im%,0,0
          rx%=(x2%-x1%)/2: ry%=(y2%-y1%)/2: xc%=x1%+rx%: yc%=y1%+ry%
          SELECT fig%
              CASE 1: 2D_LINE x1%,y1%,x2%,y2%: ' Trait
              CASE 2: 2D_POLY_FROM x1%,y2%: 2D_POLY_TO xc%,y1%: ' Triangle
                      2D_POLY_TO x2%,y2%: 2D_POLY_TO x1%,y2%
              CASE 3: 2D_RECTANGLE x1%,y1%,x2%,y2%: ' Rectangle
              CASE 4: 2D_POLY_FROM xc%+rx%,yc%: ' Ellipse
                      FOR t = 0 TO 2*pi STEP pi/180
                          2D_POLY_TO xc%+rx%*COS(t),yc%+ry%*SIN(t)
                      NEXT t
              CASE 5: ' nbr% = 5: ' étoile à 5 branches (défini dans l'appelant)
                      ri% = rx%/2.62: ' branches supérieures horizontales
                      t = PI/2
                      FOR i% = 0 TO 2*nbr%-2 STEP 2
                          x%(i%) = xc%+rx%*COS(t): y%(i%) = yc%-rx%*SIN(t)
                          t = t+2*(PI/nbr%)
                      NEXT i%
                      t = PI/2 + PI/nbr%
                      FOR i% = 1 TO 2*nbr%-1 STEP 2
                          x%(i%) = xc%+ri%*COS(t): y%(i%) = yc%-ri%*SIN(t)
                          t = t+2*PI/nbr%
                      NEXT i%
                      2D_POLY_FROM x%(0),y%(0)
                      FOR i% = 1 TO nbr%*2-1: 2D_POLY_TO x%(i%),y%(i%): NEXT i%
                      2D_POLY_TO x%(0),y%(0)
          END_SELECT
      END_IF
      PAUSE 100
  END_WHILE
  DELETE im%
  IF fig% = 5: ' étoile, màj de x1,y1,x2,y2 sur l'enveloppe
      j% = 10000: FOR i% = 0 TO 2*nbr%-1: IF x%(i%)<j% THEN j% = x%(i%)
      NEXT i%: x1% = j%
      j% = 0: FOR i% = 0 TO 2*nbr%-1: IF x%(i%)>j% THEN j% = x%(i%)
      NEXT i%: x2% = j%
      j% = 10000: FOR i% = 0 TO 2*nbr%-1: IF y%(i%)<j% THEN j% = y%(i%)
      NEXT i%: y1% = j%
      j% = 0: FOR i% = 0 TO 2*nbr%-1: IF y%(i%)>j% THEN j% = y%(i%)
      NEXT i%: y2% = j%
  END_IF
  subac% = 0
END_SUB
' ==============================================================================
SUB Ellipse(x%,y%,w%,h%)
  ' Tracé d'une ellipse vide en x%,y% de la cible 2d, inscrite dans w%,h%
  ' Bordure de la couleur courante et de l'épaisseur (1 à 20) courante
  DIM_LOCAL rx%,ry%,xc%,yc%,t
  rx% = w%/2: ry% = h%/2: xc% = x%+rx%: yc% = y%+ry%
  2D_POLY_FROM xc%+rx%,yc%
  FOR t = 0 TO 2*pi STEP pi/180
      2D_POLY_TO xc%+rx%*COS(t),yc%+ry%*SIN(t)
  NEXT t
END_SUB
' ==============================================================================
SUB Etoile(xc%,yc%,nbr%,rext%,rint%)
  ' Dessin d'une étoile à nbr% branches, centrée en xc%,yc% sur le 2d_Target
  ' Rayon enveloppe rext%, rayon intérieur rint% (estimé si rint%=0)
  ' couleur et épaisseur trait courants
  DIM_LOCAL x%(100),y%(100),i%,an
  IF rint% <= 0 THEN rint% = rext%/2.62: ' branches supérieures horizontale
  an = PI/2
  FOR i% = 0 TO 2*nbr%-2 STEP 2
      x%(i%) = xc%+rext%*COS(an)
      y%(i%) = yc%-rext%*SIN(an)
      an = an + 2*(PI/nbr%)
  NEXT i%
  an = PI/2 + PI/nbr%
  FOR i% = 1 TO 2*nbr%-1 STEP 2
      x%(i%) = xc%+rint%*COS(an)
      y%(i%) = yc%-rint%*SIN(an)
      an = an + 2*PI/nbr%
  NEXT i%
  2D_LINE x%(0),y%(0),x%(0),y%(0)
  FOR i% = 1 TO nbr%*2-1
      2D_POLY_TO x%(i%),y%(i%)
  NEXT i%
  2D_POLY_TO x%(0),y%(0)
END_SUB
' ==============================================================================

Edit 22/02 ajout de règles graduées et d'un mode d'emploi
Edit 23/02 suppression de l'entrée des dimensions de la découpe, le dessin se fait en temps réel
ReEdit: j'ai ajouté 6 boutons pour déplacer et redimensionner la sélection
1/3 ajout du défilement dans l'image de fond


Dernière édition par JL35 le Jeu 1 Mar 2018 - 17:11, édité 6 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Découpe dans une image   Mer 21 Fév 2018 - 23:50

Très intéressant ! C'est un bel outil, et extensible !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Mer 21 Fév 2018 - 23:56

Il reste une case de figure libre, au cas où !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Jeu 22 Fév 2018 - 23:03

J'ai ajouté des règles graduées en pixels, horizontale et verticale, pour faciliter le repérage, et un mode d'emploi (bouton '?').
Plus quelques bricoles d'ordre esthétique.

On peut obtenir des effets assez inattendus avec la forme étoile, en variant le paramètre diamètre intérieur (creux des branches de l'étoile).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
bignono

avatar

Nombre de messages : 1127
Age : 61
Localisation : Val de Marne
Date d'inscription : 13/11/2011

MessageSujet: Re: Découpe dans une image   Ven 23 Fév 2018 - 15:45

Bonjour à tous, Smile
Bonjour JL35 Very Happy ,
Bravo pour ce super programme!
Il y a longtemps, j'avais fait ce petit programme pour une mise au point dans un programme perso plus conséquent.
Il faut cliquer sur le form, puis maintenir le clic, et en bougeant la souris un triangle apparait plus ou moins grand suivant la distance avec le point cliqué en premier. Alors avec les flèches hautes et basses, on augmente ou on diminue le nombre de coté de la figure. Ainsi on peut avoir, un losange, un pentagone, un hexagone, heptagone, octogone, etc... Ensuite, toujours en maintenant le clic de la souris, avec les flèches gauche ou droite, on peut faire pivoter la figure. Quand on relâche le bouton de la souris, la figure devient définitive. A toi de voir si tu peux t'en servir pour l'intégrer à ton programme.
Code:
label trace
dim xd,yd,xf,yf,xv,yv,ad,bd,d,pi,qd,qf,nc,i
pi=4*atn(1)
image 2
timer 100:timer_interval 100,1:on_timer 100,trace
end

trace:
   timer_off 100
      polyg()
   timer_on 100
return

sub polyg()
if scancode=1
   qd=0:qf=pi*2:nc=3
   while mouse_left_up(0)=0
   xf=mouse_x_position(0):yf=mouse_y_position(0)
     select scancode
        case 37
           qd=qd-(pi/180):' if qd<0 then qd=0
           qf=qd+(pi*2)
        case 39
           qd=qd+(pi/180):qf=qd+(pi*2)
        case 38
           nc=nc+1:if nc>24 then nc=24
        case 40
           nc=nc-1:if nc<3 then nc=3
     end_select
     if xf<>xv or yf<>yv or scancode<>0
        d=sqr(power(xf-xd,2)+power(yd-yf,2)):ad=int(d*100)/100:bd=int(d*100)/100:2d_image_paste 2,0,0
        2d_poly_from xd+(d*cos(qd)),yd+(d*sin(qd))
        for i=qd to qf+(qf-qd)/nc step (qf-qd)/nc
           if (xd+d)<(screen_x-104)
              2d_poly_to xd+(d*cos(i)),yd+(d*sin(i))
              xf=xf+(d*cos(i)):yf=yf+(d*sin(i))
           else
           end_if
        next i
        xv=xf:yv=yf:wait 100
    end_if
   end_while
else
   2d_image_copy 2,0,0,width(0),height(0)
   xd=mouse_x_position(0):yd=mouse_y_position(0)
end_if
end_sub
PS: je crois qu'il faut enlever pi dans les déclaration de variables.
À + Wink Wink Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Ven 23 Fév 2018 - 17:27

Bonjour bignono, et merci pour ton retour.
J'ai déjà fait pas mal de modifs dans mon petit programme, que je ne comptais pas trop publier, ce n'est pas d'un intérêt puissant (j'ai par exemple ajouté la sélection de la zone à la souris, c'est plus pratique que de donner les dimensions).

Mais je vais regarder avec intérêt ton bout de code qui a l'air prometteur, et en tout cas succinct !
PS je confirme, à première vue c'est très intéressant, merci à toi bignono !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5637
Age : 64
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Découpe dans une image   Ven 23 Fév 2018 - 18:32

Bravo à vous deux,

J'ai testé celui de JL35 hier, et c'est vrai que dimensionner par SPIN ce n'est pas trop pratique.
Mais on peut toujours adapter à son goût.

Je viens de tester celui de Bignono qui est intéressant, il y a surement moyen de fusionner les deux. cheers
Une remarque: le code est ancien donc il faut supprimer la variable pi qui est devenue une variable système.

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Ven 23 Fév 2018 - 20:28

J'ai supprimé la contrainte d'entrée des dimensions de la découpe (pour toi Jean Claude), et j'ai fait comme dans l'exemple de bignono, dessin de la découpe en temps réel, ajustable à la souris.

Je n'ai pas très bien maîtrisé la gestion de la souris (les LEFT_UP et LEFT_DOWN) en voulant me passer d'un Timer, si on ne fait pas les opérations dans l'ordre (indiqué dans l'Aide) on peut avoir un dessin intempestif.
Ce n'est pas trop grave, on fait 'Annuler' et on recommence.

Il faut donc dans l'ordre:
- choisir la figure d'encadrement, sa couleur et son épaisseur de trait
- cliquer le bouton 'Sélection'
- clique dans l'image le point de départ, déplacer sans relâcher jusqu'au point opposé, puis relâcher.

Je pourrais coder assez facilement la suite: à l'aide de boutons flèches déplacer la figure dans les 4 directions, l'agrandir ou la réduire, pour la positionner exactement.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5637
Age : 64
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Découpe dans une image   Ven 23 Fév 2018 - 20:38

Tu travailles pour moi, Very Happy , je suis flatté. Et j'aime Razz

Je vais tester ça demain JL35. Ce soir je dois lâcher le clavier... Very Happy

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Ven 23 Fév 2018 - 22:00

Quel culot ! Esclavagiste ! Bachi-bouzouk ! Moule à gaufres ! Ectoplasme ! bon, j'arrête...

Bon, j'ai ajouté 6 petits boutons flèches en haut à droite, pour, une fois la sélection faite, la déplacer dans les quatre directions, ou l'agrandir ou la réduire (flèches obliques), d'un nombre de pixels choisi;
Avec ça on doit pouvoir faire à peu près tout ce qu'on veut, on sélectionne rapidos, et on peaufine avec les flèches.

Juste une petite modif ce jour 24: la fonction enregistrer n'enregistre que la zone découpée de l'image (et non la totalité comme avant).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5637
Age : 64
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Découpe dans une image   Sam 24 Fév 2018 - 18:15

Mon cher capitaine, je vous saurai gré de surveiller votre langage ! Razz

Sérieusement, j'ai testé ce matin ta nouvelle mouture.
C'est plus pratique ! Et ça marche bien. cheers

Si j'ai un peu de temps demain, ce qui n'est pas certain, j’essaierai de coupler tes boutons avec les flèches du clavier.
Çà doit être faisable mille sabords ! pirat

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Sam 24 Fév 2018 - 19:41

Citation :
Mon cher capitaine, je vous saurai gré de surveiller votre langage !
tiens, Tintin !

Pour les flèches du clavier, ça doit être faisable, mais bon... ça vaut vraiment le coup ? pour les directions, oui, mais pour les flèches 'agrandir' et 'réduire' ?

Sinon pour le programme, il faut respecter scrupuleusement l'ordre 1) bouton 'Sélection' 2) clic dans l'image
Sinon c'est un peu le bazar que je n'arrive pas trop à éviter.
Pour la figure étoile, on aurait pu imaginer un nombre variable de branches (la sub Etoile le permet), mais c'est pareil, il me semble que ça ne vaut pas le coup. Et ça complique le menu.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5637
Age : 64
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Découpe dans une image   Sam 24 Fév 2018 - 20:06

Citation :
Pour les flèches du clavier, ça doit être faisable, mais bon... ça vaut vraiment le coup ? pour les directions, oui, mais pour les flèches 'agrandir' et 'réduire' ?

C'est juste pour le plaisir de programmer. Si ça ne vaut pas le coup, au moins ça agace mes neurones Razz

J’essaierai tôt ou tard, juste pour le plaisir...

A+

PS: Very Happy "Moule à gaufres ! " quand même ! Tu y vas fort, je ne suis pas une machine.... lol!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Sam 24 Fév 2018 - 20:32

Mille sabords ! ça a dépassé ma pensée...

Quant à la programmation pour le plaisir, te gêne pas, c'est fait pour ça !
(et tant que ça n'agace pas mes neurones à moi...)

Du coup je m'aperçois que mon texte en haut de la fenêtre du programme est faux:
'Type de découpe (centrée au clip)'
c'était avant, maintenant on dessine le rectangle de sélection à la souris... va falloir que je corrige...

Tiens j'ai fait un bouton graphique pour 'Sélection':
mais je ne l'ai pas répercuté là-haut, c'est juste un gadget.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Lun 26 Fév 2018 - 18:11

J'ai réécrit le programme sous une forme un peu différente, peut-être un peu plus abordable, avec quelques choix supplémentaires (choix du nombre de branches de l'étoile, couleur de remplissage à choisir et non plus forcément blanc, sauvegarde au choix de la découpe ou de toute l'image...) je le mets ici à tout hasard.
Code:
LABEL Chfig,Chc,Figures,Imgf,Des1,Rempl,Rempl1,Deplac,Annul,Enr,Enr1,Aide
DIM bh%,bv%,het%,p%,i%,j%,k%,x1%,y1%,x2%,y2%,r%,g%,b%,cb%,cr%,res%,fig%,t
DIM wt%,wc%,wn%,hn%,wi%,hi%,f$,a$,rx%,ry%,xc%,yc%,xr%,yr%,nbr%,rc$,subac%
BORDER_SMALL 0: bh% = WIDTH(0)-WIDTH_CLIENT(0): bv% = HEIGHT(0)-HEIGHT_CLIENT(0)
wc% = 640: ' largeur container
WIDTH 0,wc%+bh%: HEIGHT 0,650: COLOR 0,64,255,255: FONT_BOLD 0: FONT_NAME 0,"Arial"

het% = 100
CONTAINER 1: WIDTH 1,wc%: HEIGHT 1,het%
ALPHA 2: PARENT 2,1: TOP 2,3: CAPTION 2," Image de fond : ": COLOR 2,255,255,0
EDIT 3: PARENT 3,1: TOP 3,TOP(2)+16: WIDTH 3,260: ON_CLICK 3,Imgf
OPEN_DIALOG 4: FILTER 4,"Image JPG,BMP|*.jpg;*.bmp"
ALPHA 5: PARENT 5,1: TOP 5,TOP(3)+25: LEFT 5,5: CAPTION 5," Figure de découpe : "
  COLOR 5,255,255,0
i% = 40: j% = 36: k% = i%/2
PICTURE 10: PARENT 10,1: TOP 10,TOP(5)+15: LEFT 10,5: WIDTH 10,i%: HEIGHT 10,j%
PICTURE 11: PARENT 11,1: TOP 11,TOP(10): LEFT 11,LEFT(10)+i%+5: WIDTH 11,i%: HEIGHT 11,j%
PICTURE 12: PARENT 12,1: TOP 12,TOP(10): LEFT 12,LEFT(11)+i%+5: WIDTH 12,i%: HEIGHT 12,j%
PICTURE 13: PARENT 13,1: TOP 13,TOP(10): LEFT 13,LEFT(12)+i%+5: WIDTH 13,i%: HEIGHT 13,j%
FOR k% = 10 TO 13: ON_CLICK k%,Chfig: NEXT k%
EDIT 14: PARENT 14,1: TOP 14,TOP(13)-16: LEFT 14,LEFT(13): WIDTH 14,20: HEIGHT 14,15
  FONT_SIZE 14,8: TEXT 14,"5": nbr% = 5: ' étoile à 5 branches
ALPHA 15: PARENT 15,1: TOP 15,TOP(14)+2: LEFT 15,LEFT(14)+21: COLOR 15,255,255,0: CAPTION 15,"br. "
fig% = 3: GOSUB Figures

CONTAINER 20: PARENT 20,1: TOP 20,0: LEFT 20,WIDTH(3)+10: WIDTH 20,146: HEIGHT 20,het%-4
  CAPTION 20,"TRACÉ :": COLOR 20,180,255,255
ALPHA 21: PARENT 21,20: TOP 21,15: LEFT 21,2: CAPTION 21,"Couleur:"
PICTURE 22: PARENT 22,20: TOP 22,TOP(21)+15: LEFT 22,6: WIDTH 22,40: HEIGHT 22,22
  COLOR 22,255,0,0
PICTURE 23: PARENT 23,20: TOP 23,TOP(21)-2: LEFT 23,54: WIDTH 23,90: HEIGHT 23,40
  ON_CLICK 23,Chc
ALPHA 24: PARENT 24,20: TOP 24,TOP(22)+26: LEFT 24,5: CAPTION 24,"Épaisseur trait:"
SPIN 25: PARENT 25,20: TOP 25,TOP(24)-2: LEFT 25,LEFT(24)+90: WIDTH 25,50
  MIN 25,1: MAX 25,20: POSITION 25,1
BUTTON 26: PARENT 26,20: TOP 26,HEIGHT(20)-23: LEFT 26,8: HEIGHT 26,22: CAPTION 26,"Tracer": ON_CLICK 26,Des1
  i% = 23: j% = WIDTH(i%)/3: k% = HEIGHT(i%)/2: 2D_TARGET_IS i%
  2D_FILL_COLOR 0,0,0: 2D_RECTANGLE 0,0,j%,k%: 2D_FILL_COLOR 255,255,255: 2D_RECTANGLE j%,0,2*j%,k%
  2D_FILL_COLOR 0,0,255: 2D_RECTANGLE 2*j%,0,3*j%,k%: 2D_FILL_COLOR 0,255,0: 2D_RECTANGLE 0,k%,j%,2*k%
  2D_FILL_COLOR 255,0,0: 2D_RECTANGLE j%,k%,2*j%,2*k%: 2D_FILL_COLOR 255,255,0: 2D_RECTANGLE 2*j%,k%,3*j%,2*k%
PICTURE 27: PARENT 27,20: TOP 27,TOP(26)+6: LEFT 27,LEFT(26)+77: WIDTH 27,14: HEIGHT 27,14
  COLOR 27,255,0,0

CONTAINER 40: PARENT 40,1: TOP 40,0: LEFT 40,LEFT(20)+WIDTH(20)+2: WIDTH 40,75
  HEIGHT 40,HEIGHT(20): COLOR 40,180,255,255: CAPTION 40,"DÉPLACER:"
BUTTON 41: PARENT 41,40: TOP 41,15: LEFT 41,8: WIDTH 41,30: HEIGHT 41,18: CAPTION 41,CHR$(217)
BUTTON 42: PARENT 42,40: TOP 42,TOP(41): LEFT 42,LEFT(41)+WIDTH(41)+2: WIDTH 42,WIDTH(41)
  HEIGHT 42,HEIGHT(41): CAPTION 42,CHR$(218)
BUTTON 43: PARENT 43,40: TOP 43,TOP(41)+HEIGHT(41): LEFT 43,8: WIDTH 43,WIDTH(41): HEIGHT 43,HEIGHT(41)
  CAPTION 43,CHR$(219)
BUTTON 44: PARENT 44,40: TOP 44,TOP(43): LEFT 44,LEFT(42): WIDTH 44,WIDTH(41): HEIGHT 44,HEIGHT(41)
  CAPTION 44,CHR$(220)
BUTTON 45: PARENT 45,40: TOP 45,TOP(43)+HEIGHT(41): LEFT 45,8: WIDTH 45,WIDTH(41): HEIGHT 45,HEIGHT(41)
  CAPTION 45,CHR$(222)
BUTTON 46: PARENT 46,40: TOP 46,TOP(45): LEFT 46,LEFT(42): WIDTH 46,WIDTH(41): HEIGHT 46,HEIGHT(41)
  CAPTION 46,CHR$(223)
FOR i% = 41 TO 46
  FONT_NAME i%,"Wingdings 3": FONT_SIZE i%,10: ON_CLICK i%,Deplac
NEXT i%
SPIN 48: PARENT 48,40: TOP 48,TOP(46)+HEIGHT(46): WIDTH 48,48: LEFT 48,5: POSITION 48,5
  FONT_SIZE 48,10
ALPHA 49: PARENT 49,40: TOP 49,TOP(48)+3: LEFT 49,LEFT(48)+WIDTH(48): CAPTION 49,"pix."

CONTAINER 30: PARENT 30,1: TOP 30,0: LEFT 30,LEFT(40)+WIDTH(40)+2: WIDTH 30,WIDTH(20)
  HEIGHT 30,HEIGHT(20): COLOR 30,180,255,255
  CAPTION 30,"REMPLISSAGE :"
ALPHA 31: PARENT 31,30: TOP 31,15: LEFT 31,2: CAPTION 31,"Couleur:"
PICTURE 32: PARENT 32,30: TOP 32,TOP(31)+15: LEFT 32,6: WIDTH 32,40: HEIGHT 32,22
PICTURE 33: PARENT 33,30: TOP 33,TOP(31)-2: LEFT 33,54: WIDTH 33,90: HEIGHT 33,40
  ON_CLICK 33,Chc
  i% = 33: j% = WIDTH(i%)/3: k% = HEIGHT(i%)/2: 2D_TARGET_IS i%
  2D_FILL_COLOR 0,0,0: 2D_RECTANGLE 0,0,j%,k%: 2D_FILL_COLOR 255,255,255: 2D_RECTANGLE j%,0,2*j%,k%
  2D_FILL_COLOR 0,0,255: 2D_RECTANGLE 2*j%,0,3*j%,k%: 2D_FILL_COLOR 0,255,0: 2D_RECTANGLE 0,k%,j%,2*k%
  2D_FILL_COLOR 255,0,0: 2D_RECTANGLE j%,k%,2*j%,2*k%: 2D_FILL_COLOR 255,255,0: 2D_RECTANGLE 2*j%,k%,3*j%,2*k%
BUTTON 36: PARENT 36,30: TOP 36,HEIGHT(30)-23: LEFT 36,8: HEIGHT 36,22: CAPTION 36,"Remplir": ON_CLICK 36,Rempl

BUTTON 38: PARENT 38,30: TOP 38,HEIGHT(30)-36: WIDTH 38,20: LEFT 38,WIDTH(30)-22: HEIGHT 38,35: CAPTION 38,"?"
  FONT_SIZE 38,10: ON_CLICK 38,Aide

BUTTON 50: PARENT 50,1: TOP 50,TOP(3)+26: LEFT 50,WIDTH(3)-75: CAPTION 50,"Annuler": ON_CLICK 50,Annul
BUTTON 51: PARENT 51,1: TOP 51,TOP(50)+28: LEFT 51,LEFT(50): CAPTION 51,"Enregistrer": ON_CLICK 51,Enr
SAVE_DIALOG 52: FILTER 52,"Fichier BMP|*.bmp"

FORM 53: BORDER_HIDE 53: HIDE 53: TOP 53,TOP(1)+TOP(51)+50: LEFT 53,LEFT(1)+LEFT(51)
  WIDTH 53,160: HEIGHT 53,80 : COLOR 53,255,255,0: FONT_BOLD 53: FONT_NAME 53,"Arial"
CONTAINER_OPTION 54: PARENT 54,53: FULL_SPACE 54
OPTION 55: PARENT 55,54: TOP 55,10: LEFT 55,5: WIDTH 55,150
  CAPTION 55,"Enregistrer la découpe"
OPTION 56: PARENT 56,54: TOP 56,TOP(55)+18: LEFT 56,LEFT(55): CAPTION 56,"Enregistrer tout"
BUTTON 57: PARENT 57,53: TOP 57,HEIGHT(53)-30: LEFT 57,30: WIDTH 57,100: CAPTION 57,"Enregistrer"
  ON_CLICK 57,Enr1

p% = 60
PICTURE p%: TOP p%,het%: WIDTH p%,640: HEIGHT p%,480
IMAGE 99
END
' ==============================================================================
Chfig:
  ' Choix du type de découpe
  k% = NUMBER_CLICK: fig% = k%-8: ' type de figure cliqué (2 à 5)
  GOSUB Figures
RETURN
' ==============================================================================
Chc:
  k% = NUMBER_CLICK
  i% = MOUSE_X_LEFT_DOWN(k%): j% = MOUSE_Y_LEFT_DOWN(k%)
  r%=COLOR_PIXEL_RED(k%,i%,j%): g%=COLOR_PIXEL_GREEN(k%,i%,j%): b%=COLOR_PIXEL_BLUE(k%,i%,j%)
  COLOR k%-1,r%,g%,b%
RETURN
' ==============================================================================
Figures:
  i% = 40: j% = 36
  FOR k% = 10 TO 13
    2D_TARGET_IS k%: CLS: COLOR k%,255,255,180
    2D_PEN_WIDTH 2: 2D_PEN_COLOR 0,0,0
    2D_FILL_OFF
    SELECT k%
        CASE 10: 2D_POLY_FROM 6,29: 2D_POLY_TO i%/2,7: 2D_POLY_TO 35,29: 2D_POLY_TO 6,29
        CASE 11: 2D_RECTANGLE 6,8,35,30
        CASE 12: Ellipse(6,8,28,20)
        CASE 13: Etoile(i%/2,j%/2,5,(j%-6)/2,-1)
    END_SELECT
  NEXT k%
  2D_TARGET_IS fig%+8: 2D_FILL_OFF: 2D_PEN_WIDTH 3: 2D_PEN_COLOR 255,0,0
  2D_RECTANGLE 1,1,i%-1,j%-1
RETURN
' ==============================================================================
Imgf:
  ' Choix de l'image de fond
  f$ = FILE_NAME$(4): a$ = UPPER$(FILE_EXTRACT_EXTENSION$(f$))
  IF a$ <> ".BMP" AND a$ <> ".JPG"
      MESSAGE "Uniquement BMP ou JPG !": RETURN
  END_IF
  TEXT 3,f$
  DimJpgBmp(f$): ' -> dimensions image wi% x hi%
  wn% = 0
  IF hi% > (SCREEN_Y-bv%-het%-30)
      hn% = SCREEN_Y-bv%-het%-30: wn% = hn%*wi%/hi%
  ELSE
      IF wi% > SCREEN_X-bh%-wc%
          wn% = SCREEN_X-bh%-wc%: hn% = wn%*hi%/wi%
      END_IF
  END_IF
  IF wn% > 0
      RedimImg(f$,wn%,hn%,""): ' -> clipboard
      wi% = wn%: hi% = hn%
  END_IF
  WIDTH p%,100: HEIGHT p%,100
  k% = wi%+bh%: IF k%<(wc%+bh%) THEN k% = wc%+bh%
  IF k% > SCREEN_X THEN k% = SCREEN_X
  WIDTH 0,k%
  k% = hi%+bv%+het%: IF k% > (SCREEN_Y-30) THEN k% = SCREEN_Y-30
  HEIGHT 0,k%
  WIDTH p%,wi%: HEIGHT p%,hi%
  IF wn% = 0
      FILE_LOAD p%,f$
  ELSE
      CLIPBOARD_PASTE p%
  END_IF
  CAPTION 2," Image de fond  =  "+STR$(wi%)+" x "+STR$(hi%)+" pixels "
  FILE_SAVE p%,fs$: ' sauvegarde de l'image de fond
RETURN
' ==============================================================================
Des1:
  IF subac% = 1 THEN RETURN
  2D_TARGET_IS p%
  2D_IMAGE_COPY 99,0,0,WIDTH(p%),HEIGHT(p%): ' sauvegarde préalable
  wt% = POSITION(25): 2D_PEN_WIDTH wt%: ' largeur tracé
  r%=COLOR_PIXEL_RED(22,5,5): g%=COLOR_PIXEL_GREEN(22,5,5): b%=COLOR_PIXEL_BLUE(22,5,5)
  2D_PEN_COLOR r%,g%,b%: ' couleur tracé
  nbr% = VAL(TEXT$(14)): IF nbr%<2 THEN nbr%=2: TEXT 14,STR$(nbr%)
  COLOR 27,0,255,0: ' feu rouge
  Tracer(p%,fig%)
  COLOR 27,255,0,0: ' feu vert
RETURN
' ==============================================================================
Rempl:
  ON_CLICK p%,Rempl1
RETURN
Rempl1:
  r%=COLOR_PIXEL_RED(22,5,5): g%=COLOR_PIXEL_GREEN(22,5,5): b%=COLOR_PIXEL_BLUE(22,5,5)
  cb% = 65536*b%+256*g%+r%: ' couleur de trait (bordure)
  r%=COLOR_PIXEL_RED(32,5,5): g%=COLOR_PIXEL_GREEN(32,5,5): b%=COLOR_PIXEL_BLUE(32,5,5)
  cr% = 65536*b%+256*g%+r%: ' couleur de remplissage
  xr% = MOUSE_X_POSITION(p%): yr% = MOUSE_Y_POSITION(p%)
  2D_IMAGE_COPY 99,0,0,WIDTH(p%),HEIGHT(p%): ' image -> presse-papier
  DLL_ON "C:\PANORAMIC\KGF\KGF.dll"
    CLIPBOARD_COPY p%
    IF cr% = -1 THEN cr% = 65536*255+256*255+255: ' blanc
    res% = DLL_CALL0("LoadPicture"): ' image presse-papier -> image interne
    res% = DLL_CALL4("FloodfillPictureToBorderColor",xr%,yr%,cr%,cb%)
    res% = DLL_CALL0("SavePicture"): ' image interne -> presse-papier
    CLIPBOARD_PASTE p%
  DLL_OFF
  OFF_CLICK p%
RETURN
' ==============================================================================
Deplac:
  i% = NUMBER_CLICK
  j% = POSITION(48)
  SELECT i%
      CASE 41: x1% = x1%-j%: x2% = x2%-j%: ' gauche
      CASE 42: x1% = x1%+j%: x2% = x2%+j%: ' droite
      CASE 43: y2% = y2%-j%: y1% = y1%-j%: ' haut
      CASE 44: y1% = y1%+j%: y2% = y2%+j%: ' bas
      CASE 45: y1% = y1%-j%: x2% = x2%+j%: ' agrandir
      CASE 46: y1% = y1%+j%: x2% = x2%-j%: ' sréduire
  END_SELECT
  2D_IMAGE_PASTE 99,0,0: ' restore image initiale
          rx%=(x2%-x1%)/2: ry%=(y2%-y1%)/2: xc%=x1%+rx%: yc%=y1%+ry%
          SELECT fig%
              CASE 1: 2D_LINE x1%,y1%,x2%,y2%: ' Trait
              CASE 2: 2D_POLY_FROM x1%,y2%: 2D_POLY_TO xc%,y1%: ' Triangle
                      2D_POLY_TO x2%,y2%: 2D_POLY_TO x1%,y2%
              CASE 3: 2D_RECTANGLE x1%,y1%,x2%,y2%: ' Rectangle
              CASE 4: 2D_POLY_FROM xc%+rx%,yc%: ' Ellipse
                      FOR t = 0 TO 2*pi STEP pi/180
                          2D_POLY_TO xc%+rx%*COS(t),yc%+ry%*SIN(t)
                      NEXT t
              CASE 5: ' nbr% = 5: ' étoile à 5 branches (défini plus haut)
                      ri% = rx%/2.62: ' branches supérieures horizontales
                      t = PI/2
                      FOR i% = 0 TO 2*nbr%-2 STEP 2
                          x%(i%) = xc%+rx%*COS(t): y%(i%) = yc%-rx%*SIN(t)
                          t = t+2*(PI/nbr%)
                      NEXT i%
                      t = PI/2 + PI/nbr%
                      FOR i% = 1 TO 2*nbr%-1 STEP 2
                          x%(i%) = xc%+ri%*COS(t): y%(i%) = yc%-ri%*SIN(t)
                          t = t+2*PI/nbr%
                      NEXT i%
                      2D_POLY_FROM x%(0),y%(0)
                      FOR i% = 1 TO nbr%*2-1: 2D_POLY_TO x%(i%),y%(i%): NEXT i%
                      2D_POLY_TO x%(0),y%(0)
          END_SELECT
RETURN
' ==============================================================================
Annul:
  2D_IMAGE_PASTE 99,0,0: ' restore
RETURN
' ==============================================================================
Enr:
  SHOW 53
  MARK_ON 55
RETURN
Enr1:
  ' Enregistrer le résultat: zone de découpe
  a$ = FILE_NAME$(52)
  2D_TARGET_IS p%
  IF CHECKED(55) = 1: ' enregistrer la découpe
      j% = wt%/2
      2D_IMAGE_COPY 99,x1%-j%,y1%-j%,x2%+j%,y2%+j%
      FILE_SAVE 99,a$
  ELSE: ' enregistrer toute l'image
      FILE_SAVE p%,a$
  END_IF
  HIDE 53
RETURN
' ==============================================================================
Aide:
  rc$ = CHR$(13)+CHR$(10)
  a$ = "   -   DÉCOUPE  DANS  UNE  IMAGE   -"+rc$+rc$
  a$=a$+"Encadrement d'une partie d'image (par exemple un visage) avec une figure"+rc$
  a$=a$+"géométrique, et remplissage en blanc de toute la zone extérieure à cette figure."+rc$+rc$
  a$=a$+"1) Choisir une image de fond jpg ou bmp (clic)"+rc$
  a$=a$+"    L'image choisie sera éventuellement redimensionnée pour tenir en entier"+rc$
  a$=a$+"    dans l'écran."+rc$
  a$=a$+"2) Choisir une figure d'encadrement (triangle, rectangle, ellipse, étoile)."+rc$
  a$=a$+"     On peut fixer le nombre de branches de l'étoile (au-dessus du symbole)."+rc$
  a$=a$+"3) Choisir la couleur du tracé, et l'épaisseur du trait de contour."+rc$
  a$=a$+"4) Cliquer le bouton 'Tracer' -> le petit voyant à droite passe au vert (sinon,"+rc$
  a$=a$+"     recliquer)."+rc$
  a$=a$+"5) Cliquer dans l'image le coin supérieur gauche de la découpe, puis sans"+rc$
  a$=a$+"    relâcher, déplacer la souris vers le coin inférieur droit, puis relâcher."+rc$
  a$=a$+"    -> la zone sélectionnée est entourée par la figure choisie."+rc$
  a$=a$+"- On peut déplacer la sélection dans les 4 directions d'un nombre de pixels choisi"+rc$
  a$=a$+"    (boutons flèches horizontales et verticales) ou l'agrandir ou la réduire (boutons"+rc$
  a$=a$+"    flèches obliques)."+rc$
  a$=a$+"6) Remplissage: couleur uniforme (en général blanc) sur la totalité de l'image"+rc$
  a$=a$+"    autour de la découpe (ou à l'intérieur, selon ce qu'on veut en faire)"+rc$
  a$=a$+"    Choisir la couleur de remplissage, cliquer le bouton 'Remplir', puis cliquer"+rc$
  a$=a$+"    dans l'image un point de la zone à remplir."+rc$+rc$
  a$=a$+"- On peut annuler (bouton 'Annuler') et recommencer la dernière opération"+rc$
  a$=a$+"   (tracé ou remplissage) autant de fois que nécessaire."+rc$+rc$
  a$=a$+"Une fois le résultat désiré obtenu, on peut enregistrer l'image résultante au"+rc$
  a$=a$+"format bmp (bouton 'Enregistrer')."+rc$
  a$=a$+"On a le choix d'enregistrer soit la totalité de l'image (qui sera aux dimensions"+rc$
  a$=a$+"de l'image affichée), soit uniquement la découpe."+rc$
  a$=a$+"On peut imaginer d'insérer cette découpe par exemple dans des cartes de voeux,"+rc$
  a$=a$+"anniversaires, etc."+rc$
  MESSAGE a$
RETURN
' ==============================================================================
SUB Tracer(p%,fig%)
  ' Tracer une figure fig% à la souris sur le picture p%
  ' Figure vide, tracée avec les paramètres actuels: largeur trait, couleur
  ' Résultat dans x1%,y1%,x2%,y2%
  ' Figures: 1= Trait, 2= Rectangle, 3= Cercle/Ellipse, 4= Étoile à nbr% branches
  subac% = 1
  DIM_LOCAL im%,xs%,ys%,xc%,yc%,rx%,ry%,t,i%,j%,x%(100),y%(100),ri%
  im% = 900: IMAGE im%
  WHILE MOUSE_LEFT_DOWN(p%) = 0: PAUSE 100: END_WHILE
  x1% = MOUSE_X_POSITION(p%): y1% = MOUSE_Y_POSITION(p%)
  2D_TARGET_IS p%: 2D_FILL_OFF
  2D_IMAGE_COPY im%,0,0,WIDTH(p%),HEIGHT(p%)
  WHILE MOUSE_LEFT_UP(p%) = 0
      x2% = MOUSE_X_POSITION(p%): y2% = MOUSE_Y_POSITION(p%)
      IF x2%<>xs% OR y2%<>ys%
          xs%=x2%: ys%=y2%
          2D_IMAGE_PASTE im%,0,0
          rx%=(x2%-x1%)/2: ry%=(y2%-y1%)/2: xc%=x1%+rx%: yc%=y1%+ry%
          SELECT fig%
              CASE 1: 2D_LINE x1%,y1%,x2%,y2%: ' Trait
              CASE 2: 2D_POLY_FROM x1%,y2%: 2D_POLY_TO xc%,y1%: ' Triangle
                      2D_POLY_TO x2%,y2%: 2D_POLY_TO x1%,y2%
              CASE 3: 2D_RECTANGLE x1%,y1%,x2%,y2%: ' Rectangle
              CASE 4: 2D_POLY_FROM xc%+rx%,yc%: ' Ellipse
                      FOR t = 0 TO 2*pi STEP pi/180
                          2D_POLY_TO xc%+rx%*COS(t),yc%+ry%*SIN(t)
                      NEXT t
              CASE 5: ' nbr% = 5: ' étoile à 5 branches (défini dans l'appelant)
                      ri% = rx%/2.62: ' branches supérieures horizontales
                      t = PI/2
                      FOR i% = 0 TO 2*nbr%-2 STEP 2
                          x%(i%) = xc%+rx%*COS(t): y%(i%) = yc%-rx%*SIN(t)
                          t = t+2*(PI/nbr%)
                      NEXT i%
                      t = PI/2 + PI/nbr%
                      FOR i% = 1 TO 2*nbr%-1 STEP 2
                          x%(i%) = xc%+ri%*COS(t): y%(i%) = yc%-ri%*SIN(t)
                          t = t+2*PI/nbr%
                      NEXT i%
                      2D_POLY_FROM x%(0),y%(0)
                      FOR i% = 1 TO nbr%*2-1: 2D_POLY_TO x%(i%),y%(i%): NEXT i%
                      2D_POLY_TO x%(0),y%(0)
          END_SELECT
      END_IF
      PAUSE 100
  END_WHILE
  DELETE im%
  IF fig% = 5: ' étoile, màj de x1,y1,x2,y2 sur l'enveloppe
      j% = 10000: FOR i% = 0 TO 2*nbr%-1: IF x%(i%)<j% THEN j% = x%(i%)
      NEXT i%: x1% = j%
      j% = 0: FOR i% = 0 TO 2*nbr%-1: IF x%(i%)>j% THEN j% = x%(i%)
      NEXT i%: x2% = j%
      j% = 10000: FOR i% = 0 TO 2*nbr%-1: IF y%(i%)<j% THEN j% = y%(i%)
      NEXT i%: y1% = j%
      j% = 0: FOR i% = 0 TO 2*nbr%-1: IF y%(i%)>j% THEN j% = y%(i%)
      NEXT i%: y2% = j%
  END_IF
  subac% = 0
END_SUB
' ==============================================================================
' ==============================================================================
SUB DimJpgBmp(f$)
   ' Image JPG ou BMP exclusivement, dimensions dans wi% et hi%
   DIM_LOCAL fm$: fm$ = "Z:\Provy.bmp"
   IF UPPER$(FILE_EXTRACT_EXTENSION$(f$)) <> ".BMP"
       PICTURE 1099: HIDE 1099: FILE_LOAD 1099,f$: FILE_SAVE 1099,fm$
       DELETE 1099: f$ = fm$
   END_IF
   FILEBIN_OPEN_READ 1,f$
       FILEBIN_POSITION 1,18: wi% = FILEBIN_READ(1)+256*FILEBIN_READ(1)
       FILEBIN_POSITION 1,22: hi% = FILEBIN_READ(1)+256*FILEBIN_READ(1)
   FILEBIN_CLOSE 1
   IF FILE_EXISTS(fm$) = 1 THEN FILE_DELETE fm$
END_SUB
' ==============================================================================
SUB RedimImg(f$,w%,h%,fr$)
  ' Redimensionner l'image f$ (BMP ou JPG) en w%,h%, résultat dans fr$ (BMP)
  ' Si fr$ = "", résultat dans le presse-papier
  ' Si w% = 0 ou h% = 0: redimensionnement proportionnel
  DIM_LOCAL fm$,wi%,hi%,cx,cy,op%
  fm$ = "C:\TEMP\Provimg.bmp"
  op% = 1900: ' objet provisoire
  IF UPPER$(FILE_EXTRACT_EXTENSION$(f$)) = ".JPG"
      PICTURE op%: FILE_LOAD op%,f$: FILE_SAVE op%,fm$: DELETE op%: f$ = fm$
  END_IF
  FILEBIN_OPEN_READ 1,f$
      FILEBIN_POSITION 1,18: wi% = FILEBIN_READ(1)+256*FILEBIN_READ(1)
      FILEBIN_POSITION 1,22: hi% = FILEBIN_READ(1)+256*FILEBIN_READ(1)
  FILEBIN_CLOSE 1
  IF h% = 0 THEN h% = w%*hi%/wi%
  IF w% = 0 THEN w% = h%*wi%/hi%
  cx = w%/wi%: cy = h%/hi%
  SCENE2D op%: HIDE op%: WIDTH op%,w%: HEIGHT op%,h%
  SPRITE op%: SPRITE_FILE_LOAD op%,f$: SPRITE_SCALE op%,cx,cy
  IF fr$ = ""
      SNAPSHOT op%,fm$
      PICTURE op%+1: FILE_LOAD op%+1,fm$: CLIPBOARD_COPY op%+1
      DELETE op%+1
  ELSE
      SNAPSHOT op%,fr$
  END_IF
  DELETE op%: IF FILE_EXISTS(fm$) = 1 THEN FILE_DELETE fm$
END_SUB
' ==============================================================================
SUB Ellipse(x%,y%,w%,h%)
  ' Tracé d'une ellipse vide en x%,y% de la cible 2d, inscrite dans w%,h%
  ' Bordure de la couleur courante et de l'épaisseur (1 à 20) courante
  DIM_LOCAL rx%,ry%,xc%,yc%,t
  rx% = w%/2: ry% = h%/2: xc% = x%+rx%: yc% = y%+ry%
  2D_POLY_FROM xc%+rx%,yc%
  FOR t = 0 TO 2*pi STEP pi/180
      2D_POLY_TO xc%+rx%*COS(t),yc%+ry%*SIN(t)
  NEXT t
END_SUB
' ==============================================================================
SUB Etoile(xc%,yc%,nbr%,rext%,rint%)
  ' Dessin d'une étoile à nbr% branches, centrée en xc%,yc% sur le 2d_Target
  ' Rayon enveloppe rext%, rayon intérieur rint% (estimé si rint%=0)
  ' couleur et épaisseur trait courants
  DIM_LOCAL x%(100),y%(100),i%,an
  IF rint% <= 0 THEN rint% = rext%/2.62: ' branches supérieures horizontale
  an = PI/2
  FOR i% = 0 TO 2*nbr%-2 STEP 2
      x%(i%) = xc%+rext%*COS(an)
      y%(i%) = yc%-rext%*SIN(an)
      an = an + 2*(PI/nbr%)
  NEXT i%
  an = PI/2 + PI/nbr%
  FOR i% = 1 TO 2*nbr%-1 STEP 2
      x%(i%) = xc%+rint%*COS(an)
      y%(i%) = yc%-rint%*SIN(an)
      an = an + 2*PI/nbr%
  NEXT i%
  2D_LINE x%(0),y%(0),x%(0),y%(0)
  FOR i% = 1 TO nbr%*2-1
      2D_POLY_TO x%(i%),y%(i%)
  NEXT i%
  2D_POLY_TO x%(0),y%(0)
END_SUB
' ==============================================================================


Dernière édition par JL35 le Mar 27 Fév 2018 - 15:56, édité 2 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5990
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Découpe dans une image   Mar 27 Fév 2018 - 1:48

Avec PANORAMIC V 0.9.28i14 ----- > ERRRRR

ERRRR:
 

Et puis rien ne va plus Embarassed


Avec PANORAMIC V 0.9.27 ---- > OK

OK:
 


Il y a peut-être un bug sur la V 0.9.28i14
Peut-être aussi que la V 0.9.28i14 a corrigé un bug de la V 0.9.27 qui a passé inaperçu  jusqu'à présent ?


Extrait du code:
 

Remarquez que l’objet 55 (Objet OPTION) est le fils de l’objet 54 (CONTAINER_OPTION) lequel objet est le fils de l’objet 53 qui lui est un objet FORM et qu’il est caché HIDE 53

Personnellement je voie que l’erreur Impossible de focaliser une fenêtre désactivée ou invisible est tout à fait à sa place



C'est à Jack de voir.

ALLEZ, ENCORE UN P'TIT EFFORT ...
... AU NOM DE LA SOLIDARITE PANORAMICIENNE
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Mar 27 Fév 2018 - 13:33

Là ça me dépasse un peu (beaucoup...)
Déjà je suis toujours sous 0.9.27, donc pas d'erreur
Et puis je ne cherche pas à focaliser quoi que ce soit, surtout sur un objet caché..., cette erreur me parait plutôt... abscons.
Ceci dit, il faudrait mettre cette fonction d'enregistrement avec ses options dans un objet visible, pour ne pas avoir ce problème...

ps. je préférais ton ancien look papydall (enfin le nouveau, si je comprends bien la chronologie... sur celui-ci tu avais environ 25 ans, si je compte bien)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Découpe dans une image   Mar 27 Fév 2018 - 13:42

Citation :
Et puis je ne cherche pas à focaliser quoi que ce soit, surtout sur un objet caché..., cette erreur me parait plutôt... abscons.
Ceci dit, il faudrait mettre cette fonction d'enregistrement avec ses options dans un objet visible, pour ne pas avoir ce problème...
Le fait de faire MARK_ON sur un OPTION le "focalise" - et ça ne marche pas s'il est caché. Fonctionnement Delphi/Windows, pas problème Panoramic.

Contournement:
au lieu de faire HIDE et SHOW, essaie de faire LEFT x,LEFT (x)-3000 et  LEFT x,LEFT (x)+3000
Ca devrait marcher, et ça aura le même effet.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Mar 27 Fév 2018 - 14:10

Merci Klaus pour l'explication, et c'est effectivement une solution.

Mais je préconise autre chose: supprimer le MARK_ON 55 de la ligne 88 (l'objet est caché), et le reporter  après la ligne 243: SHOW 53.
L'objet étant devenu visible ça devrait marcher, et visuellement ça ne change rien.

Effectivement, et je viens de faire la modif ci-dessus, expérience faite sous Panoramic 28i14, ça marche en faisant le Mark_On juste après avoir rendu l'objet visible.
(et merci aussi à papydall pour avoir essayé).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5990
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Découpe dans une image   Mar 27 Fév 2018 - 16:55

JL35 a écrit:

ps. je préférais ton ancien look papydall (enfin le nouveau, si je comprends bien la chronologie... sur celui-ci tu avais environ 25 ans, si je compte bien)

Pour te faire plaisir, je viens de changer mon avatar : un Papdall sans âge pour ne pas faire de jaloux ! tongue
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Mar 27 Fév 2018 - 17:15

Il me semble bien que tu l'avais déjà mis celui-là non ?
Mais c'est quand même moins bien que ton portrait, même éloigné dans le temps... tu n'en as pas un du début des années 1900, quand tu étais encore adolescent et beau comme un astre ? Smile
Attention, je n'ai pas dit que tu étais moche maintenant, c'est... autre chose...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6326
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Découpe dans une image   Jeu 1 Mar 2018 - 17:15

J'ai mis à jour la version initiale.
Dans le cas d'une image qui dépasserait les limites de l'écran, plutôt que de la réduire (en perdant en définition), et suite à un autre post (où je me suis inspiré de Klaus), j'ai ajouté des barres de défilement horizontale et/ou verticale, pour naviguer dans l'image.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Découpe dans une image   

Revenir en haut Aller en bas
 
Découpe dans une image
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Titre des sujets dans les sous-forums qui débordent dans l'image d'index
» metre un lien dans un image
» Comment écrire en grand un titre dans l'image du forum
» Écrire un texte dans une image
» [NUKE] pas mal de questions sur nuke....

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: