JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Assemblage d'images Jeu 13 Mar 2014 - 14:59 | |
| Pour regrouper plusieurs (jusqu'à 4) images en une seule, horizontalement ou verticalement (genre panorama). On peut soit laisser leurs dimensions d'origine aux images, soit les redimensionner à la plus grande hauteur (assemblage horizontal) ou largeur (assemblage vertical). On peut également ajuster l'espacement entre images. Par exemple (images avec leurs dimensions d'origine, espacement 20 pixels): ou (images redimensionnées: bouton 'Égaliser') (pour les curieux, les deux premières sont des tableaux de Gustave Caillebotte (1848-1894), la troisième c'est moi en vacances mais je n'arrive pas à me rappeler où, en tout cas il y avait du soleil. - Code:
-
LABEL Chf, Svf, Apercu, Exec, Egal DIM a$, f$(10), wi%, hi%, w%(10), h%(10), wt%, ht%, i%, j%, sens%, nbi%, ecart% DIM wa%, ha%, x1%, y1%, x2%, y2%, i1%, i2%, i3%, i4%, rap, tmp$, res% DIM xp%,yp%,p%(10)
WIDTH 0,916: HEIGHT 0,970: COLOR 0,164,255,255: FONT_BOLD 0: BORDER_SMALL 0 CAPTION 0, " - ASSEMBLAGE D' IMAGES -" i%=10 ALPHA i%: TOP i%,10: LEFT i%,5: CAPTION i%," Image 1: ": COLOR i%,255,255,0 EDIT i%+1: TOP i%+1,TOP(i%)-5: LEFT i%+1,60: WIDTH i%+1,430: ON_CLICK i%+1,Chf ALPHA i%+2: TOP i%+2,TOP(i%): LEFT i%+2,LEFT(i%+1)+WIDTH(i%+1)+5 i% = 13 ALPHA i%: TOP i%,TOP(i%-1)+25: LEFT i%,5: CAPTION i%," Image 2: ": COLOR i%,255,255,0 EDIT i%+1: TOP i%+1,TOP(i%)-5: LEFT i%+1,60: WIDTH i%+1,430: ON_CLICK i%+1,Chf ALPHA i%+2: TOP i%+2,TOP(i%): LEFT i%+2,LEFT(i%+1)+WIDTH(i%+1)+5 i% = 16 ALPHA i%: TOP i%,TOP(i%-1)+25: LEFT i%,5: CAPTION i%," Image 3: ": COLOR i%,255,255,0 EDIT i%+1: TOP i%+1,TOP(i%)-5: LEFT i%+1,60: WIDTH i%+1,430: ON_CLICK i%+1,Chf ALPHA i%+2: TOP i%+2,TOP(i%): LEFT i%+2,LEFT(i%+1)+WIDTH(i%+1)+5 i% = 19 ALPHA i%: TOP i%,TOP(i%-1)+25: LEFT i%,5: CAPTION i%," Image 4: ": COLOR i%,255,255,0 EDIT i%+1: TOP i%+1,TOP(i%)-5: LEFT i%+1,60: WIDTH i%+1,430: ON_CLICK i%+1,Chf ALPHA i%+2: TOP i%+2,TOP(i%): LEFT i%+2,LEFT(i%+1)+WIDTH(i%+1)+5
i% = 22 ALPHA i%: TOP i%,TOP(i%-1)+25: LEFT i%,5: CAPTION i%," Sauvegarder sous: ": COLOR i%,255,255,0 EDIT i%+1: TOP i%+1,TOP(i%)-5: LEFT i%+1,120: WIDTH i%+1,370: ON_CLICK i%+1,Svf ALPHA i%+2: TOP i%+2,TOP(i%): LEFT i%+2,LEFT(i%+1)+WIDTH(i%+1)+5
BUTTON 26: TOP 26,5: LEFT 26,LEFT(12)+80: WIDTH 26,70: HEIGHT 26,100 CAPTION 26,"<- Égaliser": ON_CLICK 26,Egal
CONTAINER_OPTION 30: TOP 30,5: LEFT 30,WIDTH(11)+260: WIDTH 30,180: HEIGHT 30,40 CAPTION 30,"Assemblage:": COLOR 30,255,255,190 OPTION 31: PARENT 31,30: TOP 31,15: LEFT 31,10: WIDTH 31,80: CAPTION 31,"Horizontal" OPTION 32: PARENT 32,30: TOP 32,TOP(31): LEFT 32,100: WIDTH 32,80: CAPTION 32,"Vertical" MARK_ON 31 ALPHA 35: TOP 35,60: LEFT 35,LEFT(30): CAPTION 35," Espacement: pixels" COLOR 35,255,255,0 SPIN 36: TOP 36,TOP(35)-3: LEFT 36,LEFT(35)+80: WIDTH 36,50 BUTTON 40: TOP 40,90: LEFT 40,LEFT(35): CAPTION 40,"Aperçu": ON_CLICK 40,Apercu BUTTON 41: TOP 41,TOP(40): LEFT 41,LEFT(40)+80: CAPTION 41,"Exec": ON_CLICK 41,Exec
xp% = 0: yp% = 134 PICTURE 60: TOP 60,yp%: LEFT 60,xp%: WIDTH 60,900: HEIGHT 60,800 2D_TARGET_IS 60: 2D_FILL_COLOR 0,0,0: 2D_FILL_DIAGONAL_UP: 2D_RECTANGLE 0,0,WIDTH(60),HEIGHT(60) PICTURE 61: TOP 61,-5000: HIDE 61: ' pour l'image résultat PICTURE 62: LEFT 62,-5000: HIDE 62: ' picture de stockage auxiliaire IMAGE 63 p%(1) = 80: PICTURE p%(1): TOP p%(1),TOP(60): HIDE p%(1): STRETCH_ON p%(1) FOR i% = 2 TO 4 p%(i%) = p%(i%-1)+1: PICTURE p%(i%): TOP p%(i%),TOP(60): HIDE p%(i%) STRETCH_ON p%(i%) NEXT i%: ' pictures réservés
OPEN_DIALOG 100 SAVE_DIALOG 101
DLL_ON "C:\PANORAMIC\KLAUS\DLLs\KGF.dll" tmp$ = "Z:\": ' répertoire de travail temporaire
END ' ============================================================================== Chf: a$ = FILE_NAME$(100): IF LEN(a$)<4 THEN RETURN i% = DLL_CALL3("AnalyzeImageFile",ADR(a$),ADR(wi%),ADR(hi%)) j% = NUMBER_CLICK i% = INT(j%/4)-1: ' n° d'image f$(i%) = a$: w%(i%) = wi%: h%(i%) = hi% TEXT j%,a$: CAPTION j%+1,STR$(wi%)+" x " + STR$(hi%) nbi% = 0 FOR i% = 1 TO 4 IF FILE_EXISTS(f$(i%)) = 1 THEN nbi% = nbi%+1 NEXT i% RETURN ' ============================================================================== Svf: a$ = FILE_NAME$(101): IF LEN(a$)<4 THEN RETURN TEXT 23,a$ CLIPBOARD_COPY 61: i% = DLL_CALL1("SaveAnyImageFile",ADR(a$)) RETURN ' ============================================================================== Apercu: IF f$(1) = "" OR f$(2) = "" THEN MESSAGE "Manque au moins un fichier image !": RETURN nbi% = 0 FOR i% = 11 TO 20 STEP 3 a$ = TEXT$(i%) IF FILE_EXISTS(a$) = 1 THEN nbi% = nbi%+1 NEXT i% sens% = 0: IF CHECKED(32) = 1 THEN sens% = 1 ' dimensions totales wt% = 0: ht% = 0 ecart% = POSITION(36) IF sens% = 0 FOR i% = 1 TO nbi% wt% = wt% + w%(i%) + ecart% IF h%(i%) > ht% THEN ht% = h%(i%) NEXT i% wt% = wt% - ecart% ELSE FOR i% = 1 TO nbi% ht% = ht% + h%(i%) + ecart% IF w%(i%) > wt% THEN wt% = w%(i%) NEXT i% ht% = ht% - ecart% END_IF CAPTION 24, STR$(wt%) + " x " + STR$(ht%) FOR i% = 1 TO 4: HIDE p%(i%): NEXT i% 2D_TARGET_IS 60: 2D_FILL_COLOR 0,0,0: 2D_FILL_DIAGONAL_UP 2D_RECTANGLE 0,0,WIDTH(60),HEIGHT(60) IF wt% > ht% wa% = WIDTH(60): ha% = wa%*ht%/wt%: rap = wa%/wt% 2D_FILL_COLOR 255,255,255: 2D_PEN_COLOR 192,192,192 2D_RECTANGLE 0,0,wa%,ha%: ' fond d'image résultante x1% = 0: y1% = 0: x2% = w%(1)*wa%/wt%: y2% = h%(1)*rap: ' image 1 TOP p%(1),TOP(60)+y1%: LEFT p%(1),x1%: WIDTH p%(1),x2%: HEIGHT p%(1),y2% FILE_LOAD p%(1),f$(1): SHOW p%(1) FOR i% = 2 TO nbi% x1% = x2%+ecart%*rap: y1% = 0: x2% = x1%+w%(i%)*rap: y2% = h%(i%)*rap TOP p%(i%),TOP(60)+y1%: LEFT p%(i%),x1%: WIDTH p%(i%),w%(i%)*rap HEIGHT p%(i%),h%(i%)*rap FILE_LOAD p%(i%),f$(i%): SHOW p%(i%) NEXT i% ELSE ha% = HEIGHT(60): wa% = ha%*wt%/ht% : rap = ha%/ht% 2D_FILL_COLOR 255,255,255: 2D_PEN_COLOR 192,192,192 2D_RECTANGLE 0,0,wa%,ha%: ' fond d'image résultante x1% = 0: y1% = 0: x2% = w%(1)*ha%/ht%: y2% = h%(1)*rap: ' image 1 TOP p%(1),TOP(60)+y1%: LEFT p%(1),x1%: WIDTH p%(1),x2%: HEIGHT p%(1),y2% FILE_LOAD p%(1),f$(1): SHOW p%(1) FOR i% = 2 TO nbi% x1% = 0: y1% = y2%+ecart%*rap: x2% = w%(i%)*rap: y2% = y1%+h%(i%)*rap TOP p%(i%),TOP(60)+y1%: LEFT p%(i%),x1%: WIDTH p%(i%),w%(i%)*rap HEIGHT p%(i%),h%(i%)*rap FILE_LOAD p%(i%),f$(i%): SHOW p%(i%) NEXT i% END_IF RETURN ' ============================================================================== Exec: IF wt% = 0 OR ht% = 0 GOSUB Apercu IF wt% = 0 OR ht% = 0 THEN RETURN END_IF WIDTH 61,wt%: HEIGHT 61,ht%
a$ = f$(1) i% = DLL_CALL1("LoadAnyImageFile",ADR(a$)): ' -> clipboard WIDTH 62,w%(1): HEIGHT 62,h%(1) 2D_TARGET_IS 62 CLIPBOARD_PASTE 62: 2D_IMAGE_COPY 63,0,0,w%(1),h%(1) x1% = 0: y1% = 0 2D_TARGET_IS 61: 2D_IMAGE_PASTE 63,x1%,y1%: ' mise en place de l'image 1
FOR i% = 2 TO nbi% a$ = f$(i%) j% = DLL_CALL1("LoadAnyImageFile",ADR(a$)): ' -> clipboard WIDTH 62,w%(i%): HEIGHT 62,h%(i%) 2D_TARGET_IS 62 CLIPBOARD_PASTE 62: 2D_IMAGE_COPY 63,0,0,w%(i%),h%(i%) 2D_TARGET_IS 61 IF sens% = 0 x1% = x1%+w%(i%-1)+ecart%: y1% = 0 ELSE x1% = 0: y1% = y1%+h%(i%-1)+ecart% END_IF 2D_IMAGE_PASTE 63,x1%,y1%: ' mise en place de l'image suivante NEXT i% CLIPBOARD_COPY 61 RETURN ' ============================================================================== Egal: j% = 0 IF sens% = 0 ' égaliser les hauteurs FOR i% = 1 TO nbi% IF h%(i%) > j% THEN j% = h%(i%) NEXT i% FOR i% = 1 TO nbi% IF h%(i%) < j% a$ = f$(i%) res% = DLL_CALL1("LoadAnyImageFile",ADR(a$)): ' image -> clipboard ha% = j%: wa% = ha%*w%(i%)/h%(i%): ' redim proportionnel a$ = tmp$ + "Image"+STR$(i%)+".jpg" res% = DLL_CALL2("ResizePicture",wa%,ha%) res% = DLL_CALL1("SaveAnyImageFile",ADR(a$)) f$(i%) = a$: w%(i%) = wa%: h%(i%) = ha% CAPTION 9+3*i%,STR$(wa%)+" x " + STR$(ha%) END_IF NEXT i% ELSE ' égaliser les largeurs FOR i% = 1 TO nbi% IF w%(i%) > j% THEN j% = w%(i%) NEXT i% FOR i% = 1 TO nbi% IF w%(i%) < j% a$ = f$(i%) res% = DLL_CALL1("LoadAnyImageFile",ADR(a$)): ' image -> clipboard wa% = j%: ha% = wa%*h%(i%)/w%(i%) a$ = tmp$ + "Image"+STR$(i%)+".jpg" res% = DLL_CALL2("ResizePicture",wa%,ha%) res% = DLL_CALL1("SaveAnyImageFile",ADR(a$)) f$(i%) = a$: w%(i%) = wa%: h%(i%) = ha% CAPTION 9+3*i%,STR$(wa%)+" x " + STR$(ha%) END_IF NEXT i% END_IF RETURN ' ============================================================================== Comme on peut le voir, je fais largement appel à KGF.dll dont les fonctions traitement d'images sont bien pratiques (merci Klaus). A ajuster, le chemin de KGF.dll et le répertoire de manoeuvre (tmp$). On peut enregistrer l'image résultante ('Sauvegarder sous...'), mais je précise qu'elle est systématiquement copiée dans le presse-papier. | |
|