JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Traitement d'image Mar 11 Juin 2019 - 15:40 | |
| Un petit traitement d'image sans prétention, par exemple pour rectifier une photo: luminosité/contraste, découper une partie intéressante (ou éliminer une partie non intéressante !), ou rectifier l'inclinaison. Usage (simple): bouton ' ?' en haut à droite. Le seul appel à une ressource externe est KGF.dll de l'ami Klaus, pour la rotation d'image (utilisation de ' TorturePicture'). J'avais bien fait un truc en pur panoramic, mais pixel par pixel c'était extrêmement long, insupportable pour des photos. C'est facilement modifiable et adaptable à ses besoins personnels. Il faut d'abord adapter le paramètre rtm$ en tête: répertoire des fichiers temporaires de manoeuvre. - Code:
-
' Traitement d'image LABEL Fin,Chf,Svf,Exec,Ajuste,Annul,Deplace,Info DIM rtm$ DIM min0%,i%,j%,pb%,co%,s1%,bh%,bv%,et%,p%,a$,f$,wi%,hi%,w%,h%,ws%,hs%,fr$,fs$ DIM rc$,ang%,rgb%,im%,ac%,pp% rtm$ = "Z:": ' répertoire de manoeuvre (fichiers temporaires) fr$ = rtm$+"Image.bmp" fs$ = rtm$+"Preced.bmp"
min0% = 800 BORDER_SMALL 0: WIDTH 0,450: HEIGHT 0,70: CAPTION 0,"- OPÉRATIONS SUR UNE IMAGE -" bh% = WIDTH(0)-WIDTH_CLIENT(0): bv% = HEIGHT(0)-HEIGHT_CLIENT(0) FONT_SIZE 0,10: FONT_BOLD 0: COLOR 0,190,255,255: ON_CLOSE 0,Fin et% = 40: ' hauteur de l'en-tête ALPHA 1: TOP 1,3: CAPTION 1,"Image:": COLOR 1,255,255,0 EDIT 2: LEFT 2,LEFT(1)+50: WIDTH 2,380: ON_CLICK 2,Chf OPEN_DIALOG 3: FILTER 3,"Images JPG,BMP|*.jpg;*.bmp" ALPHA 4: TOP 4,TOP(1): LEFT 4,LEFT(2)+WIDTH(2)+5 SAVE_DIALOG 6: FILTER 6,"Image BMP|*.bmp" p% = 100: PICTURE p%: TOP p%,et% PANEL 10: HIDE 10: TOP 10,0: WIDTH 10,WIDTH_CLIENT(0): HEIGHT 10,et%: COLOR 10,255,255,180 CONTAINER_OPTION 11: PARENT 11,10: TOP 11,0: WIDTH 11,730: HEIGHT 11,18: co%=11 i%=co%+1: OPTION i%: PARENT i%,co%: TOP i%,0: LEFT i%,5: CAPTION i%,"Redimensionner": WIDTH i%,140 i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+150: CAPTION i%,"Gamma" i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+80: CAPTION i%,"Luminosité" i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+100: CAPTION i%,"Contraste" i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+90: CAPTION i%,"Découpe" i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+90: CAPTION i%,"Rotation" i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+100: CAPTION i%,"Enregistrer" WIDTH i%,110
i%=i%+1: ALPHA i%: PARENT i%,10: TOP i%,20: CAPTION i%,"W= H=" i%=i%+1: SPIN i%: PARENT i%,10: TOP i%,17: LEFT i%,20: WIDTH i%,55: s1%=i%: ' W i%=i%+1: SPIN i%: PARENT i%,10: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+WIDTH(i%-1)+20: WIDTH i%,WIDTH(i%-1): ' H i%=i%+1: SPIN i%: PARENT i%,10: TOP i%,TOP(i%-1): LEFT i%,LEFT(co%+2)+20: WIDTH i%,55: ' Gamma i%=i%+1: SPIN i%: PARENT i%,10: TOP i%,TOP(i%-1): LEFT i%,LEFT(co%+3)+30: WIDTH i%,WIDTH(i%-1): ' Luminosité i%=i%+1: SPIN i%: PARENT i%,10: TOP i%,TOP(i%-1): LEFT i%,LEFT(co%+4)+25: WIDTH i%,WIDTH(i%-1): ' Contraste i%=i%+1: SPIN i%: PARENT i%,10: TOP i%,TOP(i%-1): LEFT i%,LEFT(co%+6)+10: WIDTH i%,50: ' angle rotation FOR j% = s1%+2 TO s1%+4: MIN j%,-128: MAX j%,127: NEXT j% i%=i%+1: ALPHA i%: PARENT i%,10: TOP i%,TOP(i%-1)-3: LEFT i%,LEFT(i%-1)+50: FONT_SIZE i%,9 CAPTION i%," + / -"+CHR$(10)+"degrés" i%=i%+1: ALPHA i%: PARENT i%,10: TOP i%,TOP(s1%)-2: LEFT i%,LEFT(co%+5)+10 FONT_SIZE i%,8: FONT_BOLD_OFF i%: CAPTION i%," Actuel:": ac%=i%
i%=i%+1: BUTTON i%: PARENT i%,10: TOP i%,20: LEFT i%,min0%-120: WIDTH i%,40: HEIGHT i%,20: CAPTION i%,"?" ON_CLICK i%,Info i%=i%+1: BUTTON i%: PARENT i%,10: TOP i%,0: WIDTH i%,50: HEIGHT i%,20: LEFT i%,min0%-70 CAPTION i%,"OK": ON_CLICK i%,Exec i%=i%+1: BUTTON i%: PARENT i%,10: TOP i%,TOP(i%-1)+20: HEIGHT i%,20: WIDTH i%,WIDTH(i%-1) LEFT i%,LEFT(i%-1): CAPTION i%,"Annul": ON_CLICK i%,Annul j% = 40 ' Flèches de déplacement (grandes images) i%=i%+1: PANEL i%: HIDE i%: TOP i%,0: WIDTH i%,4*j%: LEFT i%,WIDTH(10)+30: HEIGHT i%,40: pb%=i% FONT_NAME i%,"Wingdings": FONT_SIZE i%,16 i%=i%+1: BUTTON i%: PARENT i%,pb%: HEIGHT i%,HEIGHT(pb%): LEFT i%,0: WIDTH i%,j%: CAPTION i%,CHR$(231) i%=i%+1: BUTTON i%: PARENT i%,pb%: HEIGHT i%,HEIGHT(pb%): LEFT i%,j%: WIDTH i%,j%: CAPTION i%,CHR$(232) i%=i%+1: BUTTON i%: PARENT i%,pb%: HEIGHT i%,HEIGHT(pb%): LEFT i%,2*j%: WIDTH i%,j%: CAPTION i%,CHR$(233) i%=i%+1: BUTTON i%: PARENT i%,pb%: HEIGHT i%,HEIGHT(pb%): LEFT i%,3*j%: WIDTH i%,j%: CAPTION i%,CHR$(234) FOR j%=pb%+1 TO pb%+4: ON_CLICK j%,Deplace: NEXT j% i%=i%+1: IMAGE i%: im%=i% END ' ============================================================================== Fin: IF FILE_EXISTS(fr$) = 1 THEN FILE_DELETE fr$ IF FILE_EXISTS(fs$) = 1 THEN FILE_DELETE fs$ TERMINATE ' ============================================================================== Chf: ' Choix de l'image d'origine f$ = FILE_NAME$(3): IF FILE_EXISTS(f$) = 0 THEN RETURN TEXT 2,f$ DimJpgBmp(f$): wi% = w%: hi% = h% CAPTION 0,"ORIGINE: "+f$+" ( "+STR$(wi%)+" x "+STR$(hi%)+" pixels )" GOSUB Ajuste FILE_LOAD p%,f$ WIDTH 10,WIDTH_CLIENT(0): SHOW 10: MARK_ON co%+1 CAPTION ac%," Actuel:"+CHR$(10)+STR$(WIDTH(p%))+" x "+STR$(HEIGHT(p%))+" pix." RETURN ' ============================================================================== Svf: ' Sauvegarde du résultat a$ = FILE_NAME$(6) IF UPPER$(FILE_EXTRACT_EXTENSION$(a$))<>".BMP" MESSAGE "Le format de sauvegarde est impérativement BMP !" ELSE FILE_SAVE p%,a$ END_IF RETURN ' ============================================================================== Exec: ' Exécution de la commande choisie CLIPBOARD_COPY p%: ' sauvegarde préalable FOR i% = co%+1 TO co%+6 IF CHECKED(i%) = 1 THEN EXIT_FOR NEXT i% FILE_SAVE p%,fs$: ws% = WIDTH(p%): hs% = HEIGHT(p%): ' sauvegarde état actuel i% = i%-co%: ' option choisie SELECT i% CASE 1: w% = POSITION(s1%): h% = POSITION(s1%+1): ' Redimensionner IF w%>0 OR h%>0 RedimImg(f$,w%,h%,fr$) IF h% = 0 THEN h% = w%*hi%/wi%: ELSE: IF w%=0 THEN w%=h%*wi%/hi% GOSUB Ajuste FILE_LOAD p%,fr$: ' nouvelle image END_IF CASE 2: i% = POSITION(s1%+2): IF i%<>0 THEN GAMMA p%,i%: ' Gamma CASE 3: i% = POSITION(s1%+3): IF i%<>0 THEN BRIGHTNESS p%,i%: ' Luminosité CASE 4: i% = POSITION(s1%+4): IF i%<>0 THEN CONTRAST p%,i%: ' Contraste CASE 5: Selzone(p%,im%): ' Découpage d'une zone rectangulaire GOSUB Ajuste 2D_IMAGE_PASTE im%,0,0: ' découpe CASE 6: ang% = POSITION(s1%+5): ' Rotation de l'image d'un angle donné IF ang% <> 0 IF ang%<0 THEN ang% = 360+ang% FILE_SAVE p%,fr$ rgb% = -1: ' pas de remplissage de couleur Rotate_Img(fr$,ang%,rgb%,fr$) DimJpgBmp(fr$): ' dimensions de l'image résultante GOSUB Ajuste: FILE_LOAD p%,fr$ END_IF CASE 7: GOSUB Svf: ' Sauvegarde du résultat END_SELECT CAPTION ac%," Actuel:"+CHR$(10)+STR$(WIDTH(p%))+" x "+STR$(HEIGHT(p%))+" pix." RETURN ' ============================================================================== Ajuste: ' Ajuster Form 0 et le Picture de travail à la taille de l'image WIDTH 0,w%+bh%: IF WIDTH(0)<min0% THEN WIDTH 0,min0% IF WIDTH(0) > SCREEN_X THEN WIDTH 0,SCREEN_X HEIGHT 0,h%+bv%+et%: IF HEIGHT(0)>(SCREEN_Y-30) THEN HEIGHT 0,SCREEN_Y-30 WIDTH p%,w%: HEIGHT p%,h%: TOP p%,et%: LEFT p%,0 HIDE pb%: IF w% > WIDTH_CLIENT(0) OR h% > (HEIGHT_CLIENT(0)-et%) THEN SHOW pb% RETURN ' ============================================================================== Annul: ' Annuler la dernière opération w% = ws%: h% = hs%: GOSUB Ajuste FILE_LOAD p%,fs$: ' restore état précédent CAPTION ac%," Actuel:"+CHR$(10)+STR$(WIDTH(p%))+" x "+STR$(HEIGHT(p%))+" pix." RETURN ' ============================================================================== Deplace: ' Déplacement du Picture image dans les 4 directions (grandes images) pp% = 50: ' pixels de déplacement de l'image à chaque clic j% = NUMBER_CLICK - pb% SELECT j% CASE 1: LEFT p%,LEFT(p%)+pp%: IF LEFT(p%)>0 THEN LEFT p%,0: ' gauche CASE 2: LEFT p%,LEFT(p%)-pp%: ' droite CASE 3: TOP p%,TOP(p%)+pp%: IF TOP(p%)>et% THEN TOP p%,et%: ' haut CASE 4: TOP p%,TOP(p%)-pp%: ' bas END_SELECT RETURN ' ============================================================================== Info: ' Usage (clic sur '?') rc$ = CHR$(10) a$ = " - Cliquer l'option désirée"+rc$ a$=a$+" - Fixer ses paramètres (sous l'option correspondante)"+rc$ a$=a$+" - Puis cliquer 'OK' pour exécution."+rc$+rc$ a$=a$+"La fenêtre d'affichage s'ajuste aux dimensions de l'image."+rc$ a$=a$+"Si l'image dépasse les dimensions de l'écran, des flèches"+rc$ a$=a$+"de navigation apparaissent dans le bandeau supérieur."+rc$+rc$ a$=a$+"Redimensionnement: paramètres largeur et hauteur en pixels."+rc$ a$=a$+"Si l'une de ces valeurs est = 0, le redimensionnement sera"+rc$ a$=a$+"proportionnel aux dimensions initiales de l'image."+rc$+rc$ a$=a$+"Gamma, Luminosité, Contraste: valeurs standard -128 à +127."+rc$+rc$ a$=a$+"Découpage d'une partie rectangulaire d'image :"+rc$ a$=a$+"- Option 'Découpe', puis 'OK'"+rc$ a$=a$+"Positionner la souris sur un coin de la découpe désirée., clic."+rc$ a$=a$+" Sans relâcher, déplacer le curseur au coin opposé, puis relâcher."+rc$+rc$ a$=a$+"Rotation: a priori, les zones libérées par la rotation sont laissées en blanc"+rc$ a$=a$+"Il est possible de les colorier en modifiant dans le code le paramètre rgb%"+rc$ a$=a$+"d'appel de la sub Rotate_Img (par exemple noir, couleur de transparence)."+rc$+rc$ a$=a$+"Annuler la dernière opération: bouton 'Annul'"+rc$+rc$ a$=a$+"L'enregistrement du résultat se fait obligatoirement au format BMP." MESSAGE a$ RETURN ' ============================================================================== SUB DimJpgBmp(f$) ' Image JPG ou BMP exclusivement, dimensions dans w% et h% DIM_LOCAL fm$: fm$ = rtm$+"Provy.bmp" PICTURE 1099: HIDE 1099: FILE_LOAD 1099,f$: FILE_SAVE 1099,fm$: DELETE 1099 FILEBIN_OPEN_READ 1,fm$ FILEBIN_POSITION 1,18: w% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: h% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1 FILE_DELETE fm$ END_SUB ' ============================================================================== SUB RedimImg(f$,w%,h%,fr$) ' Redimensionner l'image f$ (BMP ou JPG) en w%,h% ' Résultat dans fr$ (BMP) ' Si w% = 0 ou h% = 0: redimensionnement proportionnel DIM_LOCAL wi%,hi%,fm$: fm$ = rtm$+"Tmp.bmp" IF UPPER$(FILE_EXTRACT_EXTENSION$(f$)) <> ".BMP" PICTURE 950: HIDE 950: FILE_LOAD 950,f$: FILE_SAVE 950,fm$: f$=fm$: DELETE 950 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%: ELSE: IF w%=0 THEN w%=h%*wi%/hi% SCENE2D 950: HIDE 950: WIDTH 950,w%: HEIGHT 950,h%: STRETCH_ON 950 FILE_LOAD 950,f$: SNAPSHOT 950,fr$: DELETE 950 IF FILE_EXISTS(fm$) = 1 THEN FILE_DELETE fm$ END_SUB ' ============================================================================== SUB Selzone(p%,im%) ' Sélectionner à la souris une zone rectangulaire dans le picture p%. ' Résultat -> objet IMAGE im% (dimensions dans w% et h%) DIM_LOCAL x1,y1,x2,y2,i%,cr%,cb% IF VARIABLE("w%") = 0 THEN DIM w% IF VARIABLE("h%") = 0 THEN DIM h% WHILE MOUSE_LEFT_DOWN(p%) = 0: PAUSE 100: END_WHILE: ' attente clic gauche x1 = MOUSE_X_LEFT_DOWN(p%): y1 = MOUSE_Y_LEFT_DOWN(p%) CLIPBOARD_COPY p%: ' sauvegarde du fond 2D_TARGET_IS p%: 2D_PEN_COLOR 255,0,255: 2D_PEN_WIDTH 1: 2D_FILL_OFF WHILE MOUSE_LEFT_UP(p%) = 0: ' attente relâchement x2 = MOUSE_X_POSITION(p%): y2 = MOUSE_Y_POSITION(p%) CLIPBOARD_PASTE p%: 2D_RECTANGLE x1,y1,x2,y2: PAUSE 50 END_WHILE CLIPBOARD_PASTE p% IF x1>x2 THEN i%=x1: x1=x2: x2=i% IF y1>y2 THEN i%=y1: y1=y2: y2=i% 2D_IMAGE_COPY im%,x1,y1,x2,y2 w% = ABS(x2-x1): h% = ABS(y2-y1): ' dimensions de la sélection END_SUB ' ============================================================================== SUB Rotate_Img(f$,angle%,rgb%,fr$) ' Rotation image f$ (JPG,BMP) de l'angle angle% en degrés ' (1 à 359°, sens des aiguilles d'une montre) ' rgb% = couleur de remplissage des zones libérées (format RGB), ou -1 ' Résultat dans fr$ (BMP), ou clipboard si fr$ = "", dimensions w% x h% DIM_LOCAL ftm$,kgf$,p%,ax%,ay%,dx%,dy%,res%,hg$,hd$,bd$,bg$,r%,g%,b% ftm$ = "C:\TEMP\TmpImg.bmp": ' À ajuster kgf$ = "C:\PANORAMIC\KGF\KGF.dll": ' idem p%=900: PICTURE p%: FILE_LOAD p%,CHR$(34)+f$+CHR$(34): FILE_SAVE p%,ftm$ FILEBIN_OPEN_READ 1,ftm$ FILEBIN_POSITION 1,18: w% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: h% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1: FILE_DELETE ftm$ DEGREES ax% = w%*COS(ABS(angle%)): ay% = h%*COS(ABS(angle%)) dx% = h%*SIN(ABS(angle%)): dy% = w%*SIN(ABS(angle%)) hg$ = STR$(dx%)+",0": hd$ = STR$(dx%+ax%)+","+STR$(dy%) bd$ = STR$(ax%)+","+STR$(dy%+ay%): bg$ = "0,"+STR$(ay%) CLIPBOARD_COPY p% DLL_ON kgf$ res% = DLL_CALL0("LoadPicture") res% = DLL_CALL4("TorturePicture",ADR(hg$),ADR(hd$),ADR(bd$),ADR(bg$)) res% = DLL_CALL0("SavePicture"): ' résultat dans le clipboard DLL_OFF IF fr$ <> "" CLIPBOARD_PASTE p%: FILE_SAVE p%,fr$ FILEBIN_OPEN_READ 1,fr$: ' dimensions totales de l'image résultat FILEBIN_POSITION 1,18: w% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: h% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1 END_IF IF rgb% > -1 AND angle%<>90 AND angle%<>180 AND angle%<>270 r% = INT(rgb%/65536): g% = BIN_AND(rgb%,65280)/256: b% = BIN_AND(rgb%,255) CLIPBOARD_PASTE p%: 2D_TARGET_IS p% 2D_FLOOD 1,1,r%,g%,b%: 2D_FLOOD w%-1,1,r%,g%,b% 2D_FLOOD 1,h%,r%,g%,b%: 2D_FLOOD w%-1,h%,r%,g%,b% CLIPBOARD_COPY p%: IF fr$ <> "" THEN FILE_SAVE p%,fr$ END_IF 2D_TARGET_IS 0: DELETE p% END_SUB ' ============================================================================== | |
|