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 |
|
|
| Rotation de bitmap | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Rotation de bitmap Jeu 23 Fév 2017 - 14:40 | |
| - Code:
-
rem ============================================================================ rem Rotation de bitmap rem ============================================================================ rem La procédure RotateImage() lit la valeur RGB du pixel en cours du 1er PICTURE, rem échange les coordonnées X et Y puis affiche le pixel dans le second PICTURE rem ============================================================================ dim x%, y%, RGB%, h%, w%, ret%, bmp$ width 0,800 bmp$ = "c:\users\acer\desktop\moto.bmp" : ' Choisir votre image ' Exemple pour une image de 366/225 ' Pour d'autres dimensions, adapter w% et h% w% = 366 : h% = 225 picture 10 : width 10,w% : height 10,h% : top 10,100 : left 10,100 picture 20 : width 20,h% : height 20,w% : top 20,10 : left 20,500
file_load 10,bmp$ caption 0,"Veuillez patienter ... je calcule ... <ESC> pour arrêter ..." dll_on "gdi32"
RotateImage()
caption 0,"TERMINE " end rem ============================================================================ ' Obtenir la valeur RGB d'un pixel de coordonnées x%,y% appartenant au handle_canvas hdc% SUB GetPixel(hdc%,x%,y%) RGB% = dll_call3("GetPixel",hdc%,x%,y%) END_SUB rem ============================================================================ ' Afficher un pixel aux coordonnées x%,y%, de couleur RGB clr% sur le handle_canvas hdc% SUB SetPixel(hdc%,x%,y%,RGB%) ret% = dll_call4("SetPixelV",hdc%,x%,y%,RGB%) END_SUB rem ============================================================================ ' Rotation d'une image bitmap par échange de coordonnées X et Y SUB RotateImage() for x% = 0 to width(10) for y% = 0 to height(10) GetPixel(handle_canvas(10),x%,y%) : ' Obtenir le pixel SetPixel(handle_canvas(20),y%,x%,RGB%) : ' Echanger ses coordonnées et l'afficher if scancode = 27 then exit_sub next y% next x% END_SUB rem ============================================================================
Modifiez la valeur de la ligne 9 : chemin de votre image. Modifiez aussi les valeurs de la ligne 12 : dimensions de votre image. Lancez le programme, croisez les bras et … patientez … patientez encore … Si tout va bien, vous obtiendrez quelque comme - Ceci:
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Rotation de bitmap Jeu 23 Fév 2017 - 15:02 | |
| Mmouarf mouarf mouarf ... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Rotation de bitmap Jeu 23 Fév 2017 - 18:15 | |
| C'est sympa (surtout l'image ) mais un peu longuet, je préfère mon script vbs... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Rotation de bitmap Jeu 23 Fév 2017 - 18:41 | |
| Sous forme de SUB, ça donne : - Code:
-
rem ============================================================================ rem Rotation d une image bitmap rem ============================================================================
RotateImage("c:\users\acer\desktop\moto.bmp",366,225)
end rem ============================================================================ ' Rotation d'une image bitmap par échange de coordonnées X et Y ' bmp$ : Chemin de l'image ' w% et h% dimensions de l'image SUB RotateImage(bmp$,w%,h%) dim_local x%, y%, RGB%, ret% width 0,800 dll_on "gdi32" picture 10 : width 10,w% : height 10,h% : top 10,100 : left 10,100 picture 20 : width 20,h% : height 20,w% : top 20,10 : left 20,500 file_load 10,bmp$ caption 0,"Veuillez patienter ... je calcule ... <ESC> pour arrêter ..." for x% = 0 to width(10) for y% = 0 to height(10) RGB% = dll_call3("GetPixel",handle_canvas(10),x%,y%) ret% = dll_call4("SetPixelV",handle_canvas(20),y%,x%,RGB%) if scancode = 27 then exit_sub next y% next x% caption 0,"TERMINE" END_SUB rem ============================================================================
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Rotation de bitmap Jeu 23 Fév 2017 - 19:34 | |
| Version sub: sur la ligne: - Code:
-
RGB% = dll_call3("GetPixel",handle_canvas(10),x%,y%) je n'y comprends rien avec cette erreur, je l'ai plusieurs fois de suite, même libellé, et parfois ça passe... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Rotation de bitmap Jeu 23 Fév 2017 - 23:40 | |
| C’est bizarre ça ! C’est la valeur d’un handle_canvas et c’est bien un entier valide. Je n’ai pas cette erreur chez moi. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Rotation de bitmap Jeu 23 Fév 2017 - 23:46 | |
| C'est d'autant plus curieux que si je mets dans la boucle un caption 0 de x et y, ça ne se produit pas toujours au même endroit, parfois (souvent) dès le début, parfois pour x entre 0 et 50... Mais toujours le même libellé (même valeur). Parfois ça va jusqu'au bout, mais c'est très rare, sinon ça s'arrête très vite en erreur. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Rotation de bitmap Ven 24 Fév 2017 - 0:05 | |
| Le code n'est pourtant pas compliqué. Essaie cette version - Code:
-
rem ============================================================================ rem Rotation d une image bitmap rem ============================================================================
RotateImage("c:\users\acer\desktop\moto.bmp",366,225)
end rem ============================================================================ ' Rotation d'une image bitmap par échange de coordonnées X et Y ' bmp$ : Chemin de l'image ' w% et h% dimensions de l'image SUB RotateImage(bmp$,w%,h%) dim_local x%, y%, RGB%, ret% ,hnd1%, hnd2% width 0,800 dll_on "gdi32" picture 10 : width 10,w% : height 10,h% : top 10,100 : left 10,100 picture 20 : width 20,h% : height 20,w% : top 20,10 : left 20,500 file_load 10,bmp$ caption 0,"Veuillez patienter ... je calcule ... <ESC> pour arrêter ..." hnd1% = handle_canvas(10) : hnd2% = handle_canvas(20) for x% = 0 to width(10) for y% = 0 to height(10) RGB% = dll_call3("GetPixel",hnd1%,x%,y%) ret% = dll_call4("SetPixelV",hnd2%,y%,x%,RGB%) if scancode = 27 then exit_sub next y% next x% caption 0,"TERMINE" END_SUB rem ============================================================================
EDIT : Tu as bien les bonnes valeurs de w% et h% ? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Rotation de bitmap Ven 24 Fév 2017 - 0:17 | |
| J'essaierai demain plus le temps Rapidement: j'ai bien les bonnes valeurs w et h par rapport à mon image. D'autre part j'ai fait un essai sans dll avec picture 20 en cible 2D et dans la boucle, COLOR_PIXEL_RED(10,x%,y%) GREEN et BLUE, puis 2D_POINT sur 20, ça marche et j'ai l'impression que le temps d'exécution est le même qu'avec les fonctions dll ... (environ 30s). là-dessus ... | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Rotation de bitmap Ven 24 Fév 2017 - 0:50 | |
| Elle fait tourner la tête ton image ! 1er code : pas de problème, ça fonctionne. 2ème code sous forme de SUB : plantage idem que JL35 => Je te mets une copie d'écran : peut-être auras-tu des indices avec... - Spoiler:
3ème code : pas de problème, fonctionnel ! Merci pour ton partage ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Rotation de bitmap Ven 24 Fév 2017 - 13:59 | |
| Papydall, Je confirme que ta dernière sub marche sans plantage. Que dis-tu d'une rotation d'image d'un angle quelconque en pur Panoramic (sans appel de dll°; Et je constate que le temps d'exécution est le même qu'avec la dll... ici 45° - Spoiler:
Il reste à ajuster le positionnement de l'image dans le picture récepteur. Le code: - Code:
-
rem ============================================================================ rem Rotation d une image bitmap rem ============================================================================ dim w%,h%,d%,bmp$,t% bmp$ = "Z:\moto.bmp"
FILEBIN_OPEN_READ 1,bmp$: ' dimensions de l'image bitmap = w% x h% 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 d% = SQR(w%*w%+h%*h%): ' diagonale WIDTH 0,w%+d%+50: HEIGHT 0,d%+60: BORDER_SMALL 0: COLOR 0,200,255,255: font_bold 0 PICTURE 10: WIDTH 10,w%:HEIGHT 10,h%: TOP 10,10+(d%-h%)/2: LEFT 10,10 FILE_LOAD 10,bmp$ PICTURE 20: WIDTH 20,d%: HEIGHT 20,d%: TOP 20,10: LEFT 20,w%+20: COLOR 20,200,255,255 PRINT TIME$: t% = NUMBER_TICKS: ' Début ImgRotn(10,20,30) t% = (NUMBER_TICKS-t%)/1000 PRINT TIME$+", durée= "+STR$(t%)+" secondes.": ' Fin END rem ============================================================================ SUB ImgRotn(p1%,p2%,rot%) ' Pivoter l'image du picture p1% d'un angle de rot% degrés, dans le picture p2% ' long, opération pixel par pixel: environ 2 minutes pour image 640x480) DIM_LOCAL ra,wi%,hi%,xc%,yc%,w2%,xc1%,yc1%,x%,y%,x1%,y1%,sra,cra wi% = WIDTH(p1%): hi% = HEIGHT(p1%) ra = rot%*PI/180: ' angle de rotation, en radians xc% = wi%/2: yc% = hi%/2: ' pivot de rotation (centre de l'image) w2% = INT(SQR(wi%*wi%+hi%*hi%)): ' diagonale (dimensions maxi du résultat) xc1% = w2%/2: yc1% = xc1%: ' centre du résultat 2D_TARGET_IS p2% sra = SIN(ra): cra = COS(ra) FOR y% = 0 TO hi%-1 FOR x% = 0 TO wi%-1 x1% = cra*(x%-xc%)-sra*(y%-yc%)+xc1% y1% = sra*(x%-xc%)+cra*(y%-yc%)+yc1% 2D_PEN_COLOR COLOR_PIXEL_RED(p1%,x%,y%),COLOR_PIXEL_GREEN(p1%,x%,y%),COLOR_PIXEL_BLUE(p1%,x%,y%) 2D_CIRCLE x1%,y1%,1: ' i/o 2d_point, pour éviter les pixels blancs NEXT x% display NEXT y% END_SUB rem ============================================================================ Sinon, pour des rotations à +/- 90° ou 180° je préfère un script vbs, c'est beaucoup plus rapide. (rotation fichier image -> fichier image) - Code:
-
SUB ImgRot90(f$,RL$,fr$) ' Rotation d'une image f$ de 90° à gauche (RL$="L") ou à droite (RL$="R") ' ou à 180° (RL$ = "RL") ' Résultat dans le fichier fr$ (-> NOTA: doit être de même type que f$) DIM_LOCAL scr$,arg$,r$,q$: q$ = CHR$(34) r$ = "270": IF UPPER$(RL$)="R" THEN r$ = "90" IF UPPER$(RL$)="RL" THEN r$ = "180" IF FILE_EXISTS(fr$) = 1 THEN FILE_DELETE fr$: ' sinon, erreur scr$ = "C:\Temp\Vbscript.vbs" FILE_OPEN_WRITE 9,scr$ FILE_WRITELN 9,"Dim Img 'As ImageFile" FILE_WRITELN 9,"Dim IP 'As ImageProcess" FILE_WRITELN 9,"Set Img = CreateObject("+q$+"WIA.ImageFile"+q$+")" FILE_WRITELN 9,"Set IP = CreateObject("+q$+"WIA.ImageProcess"+q$+")" FILE_WRITELN 9,"Img.LoadFile "+q$+f$+q$ FILE_WRITELN 9,"IP.Filters.Add IP.FilterInfos("+q$+"RotateFlip"+q$+").FilterID" FILE_WRITELN 9,"IP.Filters(1).Properties("+q$+"RotationAngle"+q$+") = "+r$ FILE_WRITELN 9,"Set Img = IP.Apply(Img)" FILE_WRITELN 9,"Img.SaveFile "+q$+fr$+q$ FILE_WRITELN 9,"WScript.Quit(0)" FILE_CLOSE 9 EXECUTE_WAIT "Wscript.exe " + scr$: ' Exécution du script FILE_DELETE scr$ END_SUB
Dernière édition par JL35 le Ven 24 Fév 2017 - 15:42, édité 2 fois | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Rotation de bitmap Ven 24 Fév 2017 - 14:23 | |
| J’ai modifié mon code pour une rotation d’un angle quelconque avec cisaillement et j’ai obtenu une drôle d’image. Malheureusement, Panoramic Editor m’ a une fois de plus joué son mauvais tour : Panoramic a cessé … et impossible to run … et j’ai perdu mon code. Je ne trouve même pas le .back. Ça frôle le désespoir ! J’ai laissé tomber tout. J’y reviendrai(s ?) le moment venu. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Rotation de bitmap Ven 24 Fév 2017 - 14:29 | |
| Salut papydall, On s'est croisés, j'avais oublié de mettre mon code ci-dessus, je viens de le rajouter (et aussi la sub en vbs). Et tu as raison, c'est rudement décourageant ce plantage sans retour et sans recours de l'éditeur, ça m'arrive de temps en temps et on perd tout. Du coup j'ai réduit la sauvegarde automatique de 10 à 5 minutes, mais en plein milieu des essais c'est agaçant, et en plus sans raison apparente ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 24 Fév 2017 - 15:43 | |
| Perso, je suis persuadé que c' est justement cette sauvegarde automatique qui fait le bug. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Rotation de bitmap Ven 24 Fév 2017 - 15:46 | |
| ? alors ce serait nouveau, depuis la dernière version... Et tout le monde ne semble pas avoir le problème ? enfin, je ne sais pas...
Mais c'est quand même une idée finalement, puisque ça arrive à des moments complètement inattendus. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Rotation de bitmap Ven 24 Fév 2017 - 17:42 | |
| C'est vrai que cette histoire de plantage est quand même très désagréable... Je te comprends Papydall, c'est désespérant de se retrouver avec une fermeture et aucune sauvegarde !
C'est pourquoi je suis en train de préparer un Pano-like editeur pour palier à ce problème. J’espère le finir rapidement... | |
| | | Contenu sponsorisé
| Sujet: Re: Rotation de bitmap | |
| |
| | | | Rotation de bitmap | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |