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 |
|
|
| Zoom d'une partie d'image | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Zoom d'une partie d'image Sam 31 Oct 2020 - 15:22 | |
| Zoom d'une zone rectangulaire d'image délimitée à la souris, pour faire ressortir un détail, par exemple: (gadget sans prétention... et bien entendu on peut adapter tous les paramètres à son goût): - Code:
-
' Zoom d'une sélection rectangulaire d'image LABEL Des,Zm DIM f$,fm$,wi%,hi%,a$,et%,x1,y1,x2,y2,w%,h%,z,w1%,h1%,s2,bw,bh,v,vv fm$ = "Z:\Toto.bmp": ' (Z:\ = répertoire de manoeuvre, à ajuster) BORDER_SMALL 0 bw = WIDTH(0)-WIDTH_CLIENT(0): bh = HEIGHT(0)-HEIGHT_CLIENT(0): ' bordures CAPTION 0,"IMAGE SOURCE :": FONT_SIZE 0,12: FONT_BOLD 0 PRINT "Choisir l'image de fond..." Chimg(): ' choix de l'image source (JPG, BMP) -> f$, wi%, hi% IF f$ = "" THEN MESSAGE "Pas d'image source, abandon !": TERMINATE CAPTION 0,f$+" ("+STR$(wi%)+" x "+STR$(hi%)+" pixels)." WIDTH 0,wi%+bw: HEIGHT 0,hi%+bh+26: FONT_SIZE 0,12: COLOR 0,240,255,255 IF WIDTH(0)<360 THEN WIDTH 0,360 FONT_NAME 0,"Consolas": FONT_BOLD 0 PICTURE 1: TOP 1,26: WIDTH 1,wi%: HEIGHT 1,hi% IMAGE 2 ALPHA 3: TOP 3,2: COLOR 3,255,255,0 CAPTION 3,"1) 2) x ," BUTTON 4: LEFT 4,LEFT(3)+20: WIDTH 4,90: CAPTION 4,"Délimiter": ON_CLICK 4,Des SPIN 6: TOP 6,-2: LEFT 6,LEFT(3)+175: WIDTH 6,42: POSITION 6,3 SPIN 7: TOP 7,TOP(6): LEFT 7,LEFT(6)+WIDTH(6)+10: WIDTH 7,40: POSITION 7,0 BUTTON 8: LEFT 8,LEFT(7)+WIDTH(7): CAPTION 8,"Zoomer": ON_CLICK 8,Zm s2 = 15: SCENE2D s2: HIDE s2: STRETCH_ON s2: ' pour zoom FORM 20: BORDER_SMALL 20: HIDE 20 PICTURE 21: PARENT 21,20: FULL_SPACE 21 TOP 20,TOP(0)+TOP(1)+bh-bw/2: LEFT 20,LEFT(0)+bw/2 FILE_LOAD 1,f$ 2D_TARGET_IS 1: 2D_FILL_OFF END ' ============================================================================== Des: ' Délimitation rectangulaire de la zone à la souris vv = 0 HIDE 20: CAPTION 0,f$ FILE_LOAD 1,f$: 2D_TARGET_IS 1: CLIPBOARD_COPY 1 WHILE MOUSE_LEFT_DOWN(1) = 1: END_WHILE: ' réinit, à tout hasard 2D_PEN_COLOR 255,0,255: et% = 1: 2D_PEN_WIDTH et%: ' couleur/épaisseur tracé CURSOR_CROSS 1 WHILE MOUSE_LEFT_DOWN(1) = 0: END_WHILE: ' attente clic souris WHILE MOUSE_LEFT_UP(1) = 1: END_WHILE: ' réinit x1 = MOUSE_X_POSITION(1): y1 = MOUSE_Y_POSITION(1) WHILE MOUSE_LEFT_UP(1) = 0 x2 = MOUSE_X_POSITION(1): y2 = MOUSE_Y_POSITION(1) CLIPBOARD_PASTE 1: 2D_RECTANGLE x1,y1,x2,y2 END_WHILE CURSOR_ARROW 1 IF x1>x2 THEN v = x1: x1 = x2: x2 = v IF y1>y2 THEN v = y1: y1 = y2: y2 = v x1 = x1+et%: y1 = y1+et%: x2 = x2-et%: y2 = y2-et% caption 0,"x1="+STR$(x1)+" y1="+ str$(y1)+" x2="+str$(x2)+" y2="+str$(y2) IF x2<=x1 OR y2<=y1 THEN CLIPBOARD_PASTE 1: RETURN 2D_IMAGE_COPY 2,x1,y1,x2,y2: vv = 1 RETURN ' ============================================================================== Zm: ' Zoom de la zone sélectionnée: ' Valeur entière + décimale éventuelle (1 seule) IF vv = 0 THEN RETURN: ' pas de zone délimitée IF LEN(STR$(POSITION(7)))>1 THEN MESSAGE "Zoom: une seule décimale !": RETURN z = POSITION(6)+POSITION(7)/10 IF z = 0 THEN MESSAGE "Zoom: valeur positive obligatoire !": RETURN w% = x2-x1: h% = y2-y1 2D_IMAGE_COPY 2,x1,y1,x1+w%,y1+h%: FILE_SAVE 2,fm$ w1% = INT(w%*z): h1% = INT(h%*z) WIDTH s2,w1%: HEIGHT s2,h1% FILE_LOAD s2,fm$: SNAPSHOT s2,fm$ FILE_LOAD 2,fm$: CLIPBOARD_COPY 2: FILE_DELETE fm$ WIDTH 20,w1%+bw: HEIGHT 20,h1%+bh: FULL_SPACE 21 CLIPBOARD_PASTE 21: SHOW 20: TO_FOREGROUND 20 a$ = STR$(w%)+" x "+STR$(h%)+" X"+STR$(z)+" = "+STR$(w1%)+" x "+STR$(h1%) a$ = a$+" pixels -> clipboard" CAPTION 20,a$ RETURN ' ============================================================================== SUB Chimg() ' Choix d'une image Bmp ou Jpg -> path f$, dimensions wi% x hi% DIM_LOCAL ob,fm$: fm$ = "Z:\Provy.bmp": ' Z:\ = répertoire de manoeuvre ob = 1099: OPEN_DIALOG ob: FILTER ob,"Image Bmp,Jpg|*.bmp;*.jpg" f$ = FILE_NAME$(ob): DELETE ob IF LEN(f$)<4 THEN f$ = "": EXIT_SUB: ' pas d'image, abandon PICTURE ob: HIDE ob: FILE_LOAD ob,f$: FILE_SAVE ob,fm$: DELETE ob FILEBIN_OPEN_READ 1,fm$ 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 FILE_DELETE fm$ END_SUB ' ============================================================================== Usage: - Choisir l'image source (on peut imaginer un OPEN_DIALOG...) - Clic le bouton " Délimiter': une croix apparaît, délimiter la zone rectangulaire à la souris - Choisir le facteur de zoom, puis clic ' Zoomer': affichage de la zone zoomée, qu'on peut déplacer où on veut (ou enregistrer: elle est dans le presse-papier). On peut recommencer en recliquant 'Délimiter', etc. NB: le facteur de zoom doit être une valeur entière et positive (contrainte SPIN)le facteur de zoom comporte une partie entière, et une partie fractionnaire (ci-dessous = 3,3) Edit 16h40Edit 17h55Edit 20h10Edit 20h40 ajouté la possibilité de valeurs non entières pour le facteur de zoom Maj 1/11
Dernière édition par JL35 le Lun 2 Nov 2020 - 17:07, édité 11 fois | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Zoom d'une partie d'image Sam 31 Oct 2020 - 15:52 | |
| Incroyable, ce qu'on peut faire avec Panoramic ! Bravo ! Euh, petit problème : C'est quand on veut refaire plusieurs fois des délimitations... | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Zoom d'une partie d'image Sam 31 Oct 2020 - 16:04 | |
| Salut JL35 ! je viens de tester et franchement c'est pas mal du tout ce petit programme. Et rapide en plus ! Salut Jjn4 ! J'ai rencontré quelques plantages aussi... Mais après avoir choisi de sauvegarder dans le même dossier que l'image initiale plus de problème ! Affaire à suivre... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Zoom d'une partie d'image Sam 31 Oct 2020 - 16:25 | |
| Salut les amis ! et merci d'avoir testé.
Effectivement j'avais eu aussi ce genre de problème, d'abord en testant avec des valeurs de zoom fractionnaires (x2,5), ça ça ne peut pas marcher, aussi j'ai filtré. Et aussi quand on fait de nouvelles tentatives, mais je croyais avoir corrigé ça ? en tout cas je. ne peux pas le rproduire.. l 'Out of system resources' se produisant il me semble quand l'image dans le presse-papier faisait 0 x 0 pixels (les valeurs de zoom non entières se traduisaient par un POSITION(6) = 0). Je vais regarder encore.
PS je n'arrive pas à reproduire le problème. J'ai fait une ou deux petites modifs mineures, plus esthétiques qu'autre chose... En tout cas il faut bien respecter l'ordre des choses: 1) bouton 'Délimiter', puis racer 2) bouton 'Zoomer' après avoir fixé le niveau de zoom.
PS2: je peux reproduire systématiquement l'erreur 'Out of system..' en faisant ceci: - je lance le programme - je clique dans l'image (par inadvertance, ou trop pressé) - je clique le bouton 'Délimiter' -> ERREUR ! Ce qui à mon avis signifie que le clic dans l'image a été mémorisé. Y a-t-il moyen de réinitialiser la souris au début du s/p Des (traitement du clic sur 'Délimiter') ?
PS3 (18h): je crois bien avoir réussi à neutraliser le clic sur l'image précédant le clic sur le bouton Délimiter. (qui provoque l'erreur Out of system resources) jjn4, si tu veux essayer à nouveau ? | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Zoom d'une partie d'image Sam 31 Oct 2020 - 19:02 | |
| Bonsoir à tous ! Super et bravo JL35 ! J’ai fait quelques tests. Pour le traçage de la zone, il faut faire attention au sens de déplacement de la souris. Il faut que x1 soit inférieur à x2 et idem pour le couple y1/y2. Sinon, boom ! Tu pourrais ajouter, entre les lignes 45 et 46 (avant le 2D_IMAGE_COPY 2,x1,y1,x2,y2), ceci pour que ce soit toujours vrai : - Code:
-
if x1 > x2 x1 = bin_xor(x1,x2) x2 = bin_xor(x1,x2) x1 = bin_xor(x1,x2) end_if if y1 > y2 y1 = bin_xor(y1,y2) y2 = bin_xor(y1,y2) y1 = bin_xor(y1,y2) end_if
Comme ça, tu peux tracer dans tous les sens : de la droite vers la gauche, du bas vers le haut… ça marche à tous les coups. Je vais faire quelques autres tests. Merci pour ton partage ! EDIT : J’ai changé les différentes variables entières en variables réelles, puis j’ai essayé différentes valeurs décimales pour z. Ton programme fonctionne super bien ! Encore bravo ! Voici un exemple pour z = 1.75 | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Zoom d'une partie d'image Sam 31 Oct 2020 - 20:15 | |
| Bonsoir Marc, et merci pour ton test très complet !
Pour le tracé à l'envers (droite à gauche), j'y avais bien pensé mais pas corrigé. C'est fait, grâce à ta suggestion. Concernant le taux de zoom, la lecture du SPIN n'autorise pas de valeurs non entières, ça renvoie 0. Donc il faudrait changer le mode de saisie, mais bon, c'est facile à modifier au besoin (par exemple un TEXT au lieu d'un SPIN, ou deux SPIN...).
PS Pour faire plaisir à Marc, j'ai ajouté un deuxième SPIN pour la partie fractionnaire du taux de zoom. Qui peut le plus peut le moins ! | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Zoom d'une partie d'image Dim 1 Nov 2020 - 14:09 | |
| C'est pas mal, tu pourrais utiliser ls commandes CURSOR_XXX qui t'éviterait de placer IMAGE_PASTE dans les boucles(mémoire moins sollicitée) et remplacer les PAUSE par DISPLAY(gain de fluidité) | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Zoom d'une partie d'image Dim 1 Nov 2020 - 14:25 | |
| Merci silverman, je vais regarder ça...
Tu as raison et j'adopte tes suggestions (je ne pense jamais à Cursor_xxx...) J'ai remplacé les PAUSE par des DISPLAY, puis finalement mis les DISPLAY en commentaires, ça marche très bien, donc plus de temporisations, ça charge peut-être le pc mais après tout il n'a que ça à faire ! J'ai aussi ajouté un appel à Open_Dialog en tête: choix de l'image source jpg ou bmp, c'est plus souple. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Zoom d'une partie d'image Lun 2 Nov 2020 - 16:14 | |
| J'ai l'erreur "Out of ressources system". Cette erreur vient de "2D_IMAGE_COPY 2,x1,y1,x2,y2" à la ligne 48. Panoramic produit cette erreur quand x2<x1. Sinon, c'est carrement plus fluide | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Zoom d'une partie d'image Lun 2 Nov 2020 - 16:41 | |
| Bonjour silverman,
Bizarre, je n'arrive pas à reproduire cette erreur, et j'avais bien rajouté des tests pour l'éviter, suite à tes remarques (lignes 45/46, pour que x2 et y2 soient toujours supérieurs à x1 et y1 quel que soit le sens de tracé)...
PS j'ai ajouté un test pour le cas où on ne sélectionnerait qu'une ligne (ou 0) verticale ou horizontale d'image, ce qui évidement provoque cette erreur (largeur ou hauteur nulle), mais je ne vois rien d'autre. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Zoom d'une partie d'image Lun 2 Nov 2020 - 17:44 | |
| Maintenant ça fonctionne, plus d'erreur! Voici le code de test que j'avais utilisé: - Code:
-
dim x1,y1,x2,y2 image 2 ' erreur si x2<x1 et y1<>y2 x1= 55 x2= 54 y1= 33 y2= 32 2D_IMAGE_COPY 2,x1,y1,x2,y2 | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Zoom d'une partie d'image Lun 2 Nov 2020 - 17:53 | |
| Ah oui effectivement, comme j'enlève l'épaisseur du trait aux mesures ça faisait des valeurs nulles qui ne plaisent au 2D_IMAGE_COPY ! Ça ne devrait plus pouvoir se produire. Merci à toi et bonne soirée ! | |
| | | Contenu sponsorisé
| Sujet: Re: Zoom d'une partie d'image | |
| |
| | | | Zoom d'une partie d'image | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |