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 |
|
|
| Extraire un sprite d'une image | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Extraire un sprite d'une image Mer 11 Nov 2015 - 18:06 | |
| Dans le calme général, une petite (enfin, pas trop) sub pour extraire une partie d'image quelconque et l'utiliser comme sprite: on affiche l'image, puis on déplace (et/ou redimensionne) un rectangle ou une ellipse dans l'image, dont le contenu sera découpé pour sauvegarde au format bmp. S'il s'agit d'une ellipse, l'enveloppe rectangulaire sera remplie de noir pur (couleur de transparence pour les sprites). - Code:
-
SUB Make_Sprite() ' Fabrication d'un sprite (bmp) à partir d'une image IF LABEL("Ficbase") = 0 THEN LABEL Ficbase IF LABEL("Ficsav") = 0 THEN LABEL Ficsav IF LABEL("Clicform") = 0 THEN LABEL Clicform IF LABEL("Vselect") = 0 THEN LABEL Vselect IF LABEL("Qvsel") = 0 THEN LABEL Qvsel IF LABEL("Fspr") = 0 THEN LABEL Fspr DIM_LOCAL fm%,f$,a$,i%,j%,p%,tp%,op%,x%,y%,w%,h%,rx%,ry%,xc%,yc%,pii,t,pas%,sp%,ffi% DIM_LOCAL b1%,b2%,b3%,b4%,b5%,b6%,b7%,b8%,bv%,ex%,ey%,ew%,eh%,od%,pi%,vi%(8),wi%,hi% DIM_LOCAL ps%,es%,sd%,im%,xp%,yp%,r%,g%,b%,ffm$,fn% ffm$ = "C:\TEMP\Dima.bmp" fm% = 1000 FORM fm%: WIDTH fm%,660: HEIGHT fm%,620: FONT_NAME fm%,"Arial": FONT_BOLD fm% COLOR fm%,164,255,255: BORDER_SMALL fm%: ON_CLOSE fm%,Fspr CAPTION fm%," - DÉCOUPAGE D' UN SPRITE DANS UNE IMAGE -" i% = fm%+1 ALPHA i%: PARENT i%,fm%: TOP i%,3: LEFT i%,5: CAPTION i%,"Image de base (JPG, BMP) :" i%=i%+1 EDIT i%: PARENT i%,fm%: TOP i%,TOP(i%-1)-3: LEFT i%,160: WIDTH i%,400 ON_CLICK i%,Ficbase i%=i%+1: BUTTON i%: PARENT i%,fm%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+WIDTH(i%-1)+5 CAPTION i%,"Quitter": ON_CLICK i%,Fspr i% = i%+1 CONTAINER_OPTION i%: PARENT i%,fm%: TOP i%,30: LEFT i%,5: WIDTH i%,115: HEIGHT i%,65 COLOR i%,255,255,128: CAPTION i%,"Zone à découper :" i%=i%+1: OPTION i%: PARENT i%,i%-1: TOP i%,20: LEFT i%,10: CAPTION i%,"Rectangle" MARK_ON i%: ON_CLICK i%,Clicform: op% = i% i%=i%+1: OPTION i%: PARENT i%,i%-2: TOP i%,40: LEFT i%,10: CAPTION i%,"Ellipse/cercle" ON_CLICK i%,Clicform i% = i%+1: b1% = i% BUTTON i%: PARENT i%,fm%: TOP i%,25: LEFT i%,160: WIDTH i%,30: HEIGHT i%,25 CAPTION i%,CHR$(233) i% = i%+1: b2% = i% BUTTON i%: PARENT i%,fm%: TOP i%,50: LEFT i%,125: WIDTH i%,30: HEIGHT i%,25 CAPTION i%,CHR$(231) i% = i%+1: b3% = i% BUTTON i%: PARENT i%,fm%: TOP i%,50: LEFT i%,195: WIDTH i%,30: HEIGHT i%,25 CAPTION i%,CHR$(232) i% = i%+1: b4% = i% BUTTON i%: PARENT i%,fm%: TOP i%,75: LEFT i%,160: WIDTH i%,30: HEIGHT i%,25 CAPTION i%,CHR$(234) i% = i%+1: b5% = i% BUTTON i%: PARENT i%,fm%: TOP i%,25: LEFT i%,230: WIDTH i%,30: HEIGHT i%,37 CAPTION i%,CHR$(244) i% = i%+1: b6% = i% BUTTON i%: PARENT i%,fm%: TOP i%,62: LEFT i%,230: WIDTH i%,30: HEIGHT i%,37 CAPTION i%,CHR$(243) i% = i%+1: b7% = i% PICTURE i%: PARENT i%,fm%: TOP i%,27: LEFT i%,262: WIDTH i%,27: HEIGHT i%,34 PRINT_TARGET_IS i%: FONT_NAME i%,"Wingdings": FONT_SIZE i%,12: FONT_BOLD i% PRINT_LOCATE 6,2: PRINT CHR$(242): PRINT_LOCATE 5,15: PRINT CHR$(241) i% = i%+1: b8% = i% BUTTON i%: PARENT i%,fm%: TOP i%,62: LEFT i%,260: WIDTH i%,30: HEIGHT i%,37 CAPTION i%,CHR$(240)+CHR$(239) FOR j% = b1% TO b8% FONT_NAME j%,"Wingdings": FONT_SIZE j%,13: ON_CLICK j%,Clicform NEXT j% i%=i%+1: SPIN i%: PARENT i%,fm%: TOP i%,50: LEFT i%,155: WIDTH i%,40: HEIGHT i%,20 FONT_SIZE i%,10: POSITION i%,5: sp% = i% i%=i%+1 ALPHA i%: PARENT i%,fm%: TOP i%,30: LEFT i%,300: CAPTION i%,"X=" i%=i%+1: ex% = i% EDIT i%: PARENT i%,fm%: TOP i%,TOP(i%-1)-3: LEFT i%,LEFT(i%-1)+20: WIDTH i%,50: HEIGHT i%,17 i%=i%+1 ALPHA i%: PARENT i%,fm%: TOP i%,47: LEFT i%,300: CAPTION i%,"Y=" i%=i%+1: ey% = i% EDIT i%: PARENT i%,fm%: TOP i%,TOP(i%-1)-3: LEFT i%,LEFT(i%-1)+20: WIDTH i%,50: HEIGHT i%,17 i%=i%+1 ALPHA i%: PARENT i%,fm%: TOP i%,64: LEFT i%,300: CAPTION i%,"W=" i%=i%+1: ew% = i% EDIT i%: PARENT i%,fm%: TOP i%,TOP(i%-1)-3: LEFT i%,LEFT(i%-1)+20: WIDTH i%,50: HEIGHT i%,17 i%=i%+1 ALPHA i%: PARENT i%,fm%: TOP i%,81: LEFT i%,300: CAPTION i%,"H=" i%=i%+1: eh% = i% EDIT i%: PARENT i%,fm%: TOP i%,TOP(i%-1)-3: LEFT i%,LEFT(i%-1)+20: WIDTH i%,50: HEIGHT i%,17 i%=i%+1: ALPHA i%: PARENT i%,fm%: TOP i%,30: LEFT i%,400 CAPTION i%,"Sauvegarder la sélection vers (BMP) :" i%=i%+1: EDIT i%: PARENT i%,fm%: TOP i%,TOP(i%-1)+15: LEFT i%,LEFT(i%-1) WIDTH i%,240: ON_CLICK i%,Ficsav: es% = i% i%=i%+1: BUTTON i%: PARENT i%,fm%: TOP i%,TOP(es%)+25: LEFT i%,LEFT(es%): WIDTH i%,100 CAPTION i%,"Voir la sélection": HIDE i%: ON_CLICK i%,Vselect: bv% = i%
i%=i%+1: p%=i% PICTURE p%: PARENT p%,fm%: TOP p%,100: LEFT p%,0: WIDTH p%,640: HEIGHT p%,480
i%=i%+1: fn%=i%: FORM fn%: TOP fn%,TOP(fm%)+TOP(p%)+26: LEFT fn%,LEFT(fm%)+LEFT(p%) BORDER_SMALL fn%: COLOR fn%,164,190,220: HIDE fn%: ON_CLOSE fn%,Qvsel i%=i%+1: PICTURE i%: PARENT i%,fn%: ON_CLICK i%,Qvsel: ps% = i%
i%=i%+1: OPEN_DIALOG i%: FILTER i%,"Images|*.bmp;*.jpg;": od% = i% i%=i%+1: SAVE_DIALOG i%: FILTER i%,"Image|*.bmp;": sd% = i% i%=i%+1: IMAGE i%: im% = i%
2D_TARGET_IS p%: 2D_PEN_COLOR 255,0,0: 2D_PEN_WIDTH 1: 2D_FILL_OFF x% = 50: y% = 50: w% = 50: h% = 100: ' a priori WHILE ffi% = 0: PAUSE 50: END_WHILE DELETE fm%: DELETE fn%: DELETE od%: DELETE sd%: DELETE im% EXIT_SUB ' = = = = = = = = = Ficbase: a$ = FILE_NAME$(od%): IF LEN(a$)<4 THEN RETURN ' Dimensions d'une image Bmp ou Jpg -> clipboard, sous la forme: wwwxhhh pi%=970: WHILE OBJECT_EXISTS(pi%)=1: pi% = pi%+1: END_WHILE f$ = a$: TEXT fm%+2,f$ PICTURE pi%: TOP pi%,-1000: LEFT pi%,-1000 FILE_LOAD pi%,f$: FILE_SAVE pi%,ffm$ FILEBIN_OPEN_READ 9, ffm$ FILEBIN_POSITION 9,18: FILEBIN_BLOCK_READ 9,8,vi%(0) FILEBIN_CLOSE 9: FILE_DELETE ffm$ wi% = vi%(0)+256*vi%(1): hi% = vi%(4)+256*vi%(5) DELETE pi% WIDTH p%,wi%: IF wi%>640 THEN WIDTH fm%,wi%+20 HEIGHT p%,hi%: HEIGHT fm%,hi%+140 FILE_LOAD p%,f$: CLIPBOARD_COPY p% GOSUB Clicform RETURN ' = = = = = = = = = Ficsav: a$ = FILE_NAME$(sd%): IF LEN(a$)<4 THEN RETURN TEXT es%,a$ IF CHECKED(op%+1) = 1: ' c'est une ellipse, contour en noir pur 2D_PEN_COLOR 0,0,0: 2D_POLY_FROM xc%+rx%,yc% FOR t = 0 TO 2*pii STEP pii/180 2D_POLY_TO xc%+rx%*COS(t),yc%+ry%*SIN(t) NEXT t FOR yp% = y% TO y%+h% FOR xp% = x% TO x%+w%/2 r%=COLOR_PIXEL_RED(p%,xp%,yp%): g%=COLOR_PIXEL_GREEN(p%,xp%,yp%): b%=COLOR_PIXEL_BLUE(p%,xp%,yp%) IF (r%+g%+b%)=0 THEN EXIT_FOR 2D_POINT xp%,yp% NEXT xp% FOR xp%=x%+w% TO x%+w%/2 STEP -1 r%=COLOR_PIXEL_RED(p%,xp%,yp%): g%=COLOR_PIXEL_GREEN(p%,xp%,yp%): b%=COLOR_PIXEL_BLUE(p%,xp%,yp%) IF (r%+g%+b%)=0 THEN EXIT_FOR 2D_POINT xp%,yp% NEXT xp% NEXT yp% 2D_PEN_COLOR 255,0,0 ELSE CLIPBOARD_PASTE p%: ' c'est un rectangle END_IF 2D_IMAGE_COPY im%,x%,y%,x%+w%,y%+h% FILE_SAVE im%,a$ CLIPBOARD_PASTE p% GOSUB Clicform TO_FOREGROUND fm% SHOW bv% RETURN ' = = = = = = = = = Clicform: pas% = POSITION(sp%) i% = NUMBER_CLICK IF i% = b1% THEN y% = y%-pas%: IF y%<0 THEN y% = 0 IF i% = b2% THEN x% = x%-pas%: IF x%<0 THEN x% = 0 IF i% = b3% THEN x% = x%+pas% IF i% = b4% THEN y% = y%+pas% IF i% = b5% THEN h% = h%+pas% IF i% = b6% THEN w% = w%+pas% IF i% = b7% THEN h% = h%-pas%: IF h%<0 THEN h% = 0 IF i% = b8% THEN w% = w%-pas%: IF w%<0 THEN w% = 0 TEXT ex%,STR$(x%): TEXT ey%,STR$(y%): TEXT ew%,STR$(w%): TEXT eh%,STR$(h%) CLIPBOARD_PASTE p% IF CHECKED(op%) = 1 2D_RECTANGLE x%,y%,x%+w%,y%+h% ELSE rx% = w%/2: ry% = h%/2: xc% = x%+rx%: yc% = y%+ry% pii = 4*ATN(1) 2D_POLY_FROM xc%+rx%,yc% FOR t = 0 TO 2*pii STEP pii/180 2D_POLY_TO xc%+rx%*COS(t),yc%+ry%*SIN(t) NEXT t END_IF RETURN ' = = = = = = = = = Vselect: WIDTH fn%,w%+18: HEIGHT fn%,h%+47: WIDTH ps%,w%: HEIGHT ps%,h% FILE_LOAD ps%,a$: SHOW fn%: TO_FOREGROUND fn% RETURN ' = = = = = = = = = Qvsel: HIDE fn% RETURN ' = = = = = = = = = Fspr: ffi% = 1 RETURN ' = = = = = = = = = END_SUB Edit petites modifs
Dernière édition par JL35 le Mer 11 Nov 2015 - 22:26, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Extraire un sprite d'une image Mer 11 Nov 2015 - 18:27 | |
| | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 11 Nov 2015 - 18:31 | |
| Et pas que pour les sprites !... | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Extraire un sprite d'une image Mer 11 Nov 2015 - 18:34 | |
| Effectivement, l'idée est bonne.
Cela facilite le travail du programmeur de jeu.
Je vais tester çà.
A+ | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Extraire un sprite d'une image Mer 11 Nov 2015 - 18:49 | |
| Merci JL35 ! Beau travail ! Je testerai ce soir.
Edit : Je viens de tester. Après avoir créé le répertoire c:\temp, le programme fonctionne bien. Bravo ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire un sprite d'une image Mer 11 Nov 2015 - 19:45 | |
| Merci à tous pour le retour. Exact Marc37, j'aurais dû préciser en tête de la sub pour le fichier temporaire. Tu as raison ygeronimi, il y a d'autres utilisations, par exemple l'incrustation d'image (cartes de voeux, menus de Noël...). On peut aussi détourer l'image obtenue au pinceau (numérique), au noir pur, pour ne laisser que l'essentiel, une tête par exemple... ce sera l'objet d'une autre sub... Une petite remarque d'ordre général (que j'ai déjà faite plusieurs fois il me semble): dommage que la commande SELECT n'accepte que des valeurs numériques dans les rubriques CASE, et non des variables ou même expressions comme en QBasic ou en FreeBasic. J'ai dû me résoudre à une série de IF...THEN... pas très élégants. Utilisation: Par exemple, incrustation du sprite obtenu dans une autre image. On affiche l'image réceptrice dans un SCENE2D, on charge le sprite, puis on l'insère à la position voulue dans l'image, en x,y. Pour la sauvegarde du résultat, le File_Save ne marche, il faut faire une copie d'écran et la sauvegarder dans un fichier bmp, par exemple: - Code:
-
DIM ff$ ff$ = "C:\Graph\bmp\goldgate.bmp": ' image de fond (640x480) fs$ = "Z:\Cheval.bmp": ' sprite importé fr$ = "Z:\Capture.bmp": ' image résultat (fond + sprite) WIDTH 0,660: HEIGHT 0,550 scene2D 1: width 1,640: height 1,480 file_load 1,ff$ sprite 2: sprite_file_load 2,fs$ sprite_x_position 2,100: sprite_y_position 2,165 Capture0(0,0,640,480,fr$): ' sauvegarde du résultat dans fr$ END
SUB Capture0(x,y,w,h,f$) ' Capture écran d'une zone de Form 0, en x,y relatifs, dimensions w x h, ' dans f$ (bmp), ou dans le presse-papier (clipboard) si f$ = "clip" ' ATTENTION: x et y relatifs à FORM 0 DIM_LOCAL c2d% c2d% = NUMBER_2D_TARGET: 2D_TARGET_IS 0: WAIT 100 IMAGE 1000: 2D_IMAGE_COPY 1000,x,y,x+w,y+h IF UPPER$(f$) = "CLIP" CLIPBOARD_COPY 1000 ELSE FILE_SAVE 1000,f$ END_IF DELETE 1000 2D_TARGET_IS c2d% END_SUB Les chemins et les noms sont à ajuster, évidemment. J'ai détouré mon cheval/sprite en noir (avec IrfanView pour aller plus vite ), et je l'ai intégré comme ça dans une image qui n'a rien à voir, c'est idiot mais c'est juste pour la démo: | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire un sprite d'une image Jeu 12 Nov 2015 - 17:58 | |
| Pour détourer plus finement une image/sprite avec du noir pur (couleur de transparence), en dessin manuel: - Code:
-
SUB Detourage(f$,fr$) ' Détourage manuel au noir d'un sprite f$ (bmp) ' Résultat dans clipboard et fr$ (si fr$ est un chemin bmp) IF FILE_EXISTS(f$)=0 OR UPPER$(RIGHT$(f$,4))<>".BMP" THEN EXIT_SUB DIM_LOCAL v%(8),w%,h%,fm%,i%,p%,xd%,yd%,x%,y% IF LABEL("Annder")=0 THEN LABEL Annder IF LABEL("Qdes")=0 THEN LABEL Qdes IF LABEL("Qdes1")=0 THEN LABEL Qdes1 FILEBIN_OPEN_READ 9, f$ FILEBIN_POSITION 9, 18: FILEBIN_BLOCK_READ 9,8,v%(0) w% = v%(0)+256*v%(1)+65536*v%(2)+16777216*v%(3) h% = v%(4)+256*v%(5)+65536*v%(6)+16777216*v%(7) FILEBIN_CLOSE 9 fm% = 900 x% = w%+18: IF x%<320 THEN x% = 320 FORM fm%: WIDTH fm%,x%: HEIGHT fm%,h%+70: BORDER_SMALL fm%: FONT_NAME fm%,"Arial" FONT_BOLD fm%: COLOR fm%,255,255,164: CAPTION fm%,"DÉTOURAGE SPRITE": ON_CLOSE fm%,Qdes1 i%=fm%+1: ALPHA i%: PARENT i%,fm%: TOP i%,5:LEFT i%,3: CAPTION i%,"Trait :" i%=i%+1: SPIN i%: PARENT i%,fm%: TOP i%,TOP(i%-1)-3: LEFT i%,40: WIDTH i%,35 i%=i%+1: BUTTON i%: PARENT i%,fm%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+40: WIDTH i%,90 HEIGHT i%,20: CAPTION i%,"Annul dernier": ON_CLICK i%,Annder i%=i%+1: BUTTON i%: PARENT i%,fm%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+10: HEIGHT i%,20 WIDTH i%,90: CAPTION i%,"Enreg./Quitter": ON_CLICK i%,Qdes p%=i%+1: PICTURE p%: PARENT p%,fm%: TOP p%,25: LEFT p%,0: WIDTH p%,w%: HEIGHT p%,h% FILE_LOAD p%,f$ 2D_TARGET_IS p%: 2D_PEN_COLOR 0,0,0: ' noir pur WHILE 2 > 1 WHILE MOUSE_LEFT_DOWN(p%) = 0: PAUSE 100: END_WHILE CLIPBOARD_COPY p%: ' sauvegarde préalable xd% = MOUSE_X_POSITION(p%): yd% = MOUSE_Y_POSITION(p%): ' point de départ du dessin 2D_PEN_WIDTH POSITION(fm%+2) WHILE MOUSE_LEFT_UP(p%) = 0 x% = MOUSE_X_POSITION(p%): y% = MOUSE_Y_POSITION(p%) CAPTION 0, " x="+STR$(x%)+" y="+STR$(y%) 2D_LINE xd%,yd%,x%,y%: xd% = x%: yd% = y% PAUSE 50 END_WHILE END_WHILE GOTO Qdes Annder: CLIPBOARD_PASTE p% RETURN Qdes: CLIPBOARD_COPY p%: IF fr$<>"" THEN FILE_SAVE p%,fr$ Qdes1: DELETE fm% END_SUB | |
| | | Contenu sponsorisé
| Sujet: Re: Extraire un sprite d'une image | |
| |
| | | | Extraire un sprite d'une image | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |