Gambas France BETA


Pas de compte ? Incription

Faire tourner une image.

Ce sujet est résolu.

1
AuteurMessages
Esprit#1 Posté le 2/11/2012 à 12:04:52
Bonjour à tous,

Je fais partie d'une association de robotique, l'Association Caliban Belgique (branche belge). L'an passé, avec l'école, j'ai participé à un concours de robotique dont l'objectif était de concevoir un petit robot mobile et de le diriger à partir de son ordinateur. Nous avions alors programmé une petite interface en VB.Net (que nous apprenions en cours). Cette année, on participe en tant qu'asso'. Et tant qu'à faire, autant passer sur du libre.

Pour mes tests, j'aimerais faire tourner une image de 0 à 180°. J'ai donc fait un mini-programme avec juste 3 boutons (0 - 90 et 180°) et une progressbar pour gérer l'angle plus finement. (voir cette capture d'écran)

Par contre... Je n'arrive pas à faire tourner l'image.
Il y a bien une fonction "picturebox.Picture.Image.Rotate(float)" mais si je mets :

1
2
3
4
5
PUBLIC SUB bouton90_Click()

slider.Value = 90
picRoue.Picture.Image.Rotate(90)
END


L'image ne bouge pas. Une idée ?
Je débute en Gambas donc j'ai encore un peu de mal.

Merci d'avance,
Roboticien de l'Association Caliban,
Débutant en Gambas.
Prokopy#2 Posté le 2/11/2012 à 23:38:20
Kinder PinguiSalut Esprit,

La fonction Image.Rotate() ne fonctionne pas tout à fait comme cela. Elle ne modifie pas l'image elle-même, mais une copie de celle-ci (qui est retournée, voir la documentation pour plus de détails).

Le code qui ferait tourner l'image serait donc celui-ci :

1
2
3
4
5
PUBLIC SUB bouton90_Click()

picRoue.Picture = picRoue.Picture.Image.Rotate(90)

END


Cependant, avec ce code les effets vont s'additionner à chaque clic (vu que l'image modifiée de la pictureBox est rechargée puis remodifiée). Il faut donc sauvegarder l'image originale en mémoire (en la chargeant au préalable avec la fonction Image.Load() ), de cette façon :

1
2
3
4
5
6
7
PRIVATE imageOriginale AS Image = Image.Load("imageRoue.png")

PUBLIC SUB bouton90_Click()

picRoue.Picture = imageOriginale.Rotate(90).Picture

END


Voilà, n'hésite pas à demander si tu as d'autres questions. :)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
Esprit#3 Posté le 3/11/2012 à 12:21:54
Merci pour cette réponse claire et rapide, je teste ça cette après-midi. :-)

[edit :
Alors, j'ai testé tes solutions. La première aussi, ne serait-ce que pour voir ce que ça fait.

La première me renvoie une erreur.
1
2
3
PUBLIC SUB bouton90_Click()
picRoue.Picture = picRoue.Picture.Image.Rotate(90)
END

Erreur : Type mismatch: wanted picture, got image instead

Est-ce du au fait que je n'ai pas déclaré l'image utilisée dans le code mais directement en cliquant sur le "pictureBox", dans la partie création graphique ?

La deuxième solution fait bien tourner l'image. Par contre, pas de 90°... Je vais fouiller la doc pour comprendre. :suspect:
Roboticien de l'Association Caliban,
Débutant en Gambas.
Esprit#4 Posté le 4/11/2012 à 10:09:10
L'argument pour l'angle doit être en radian. Voilà pourquoi ça ne correspondait pas à ce que j'attendais.
(Rappel : 1 radian = ~57.3° )

Ça fonctionne parfaitement maintenant. Merci.
Roboticien de l'Association Caliban,
Débutant en Gambas.
Prokopy#5 Posté le 4/11/2012 à 11:54:05
Kinder Pingui
Merci pour cette réponse claire et rapide, je teste ça cette après-midi. :-)

[edit :
Alors, j'ai testé tes solutions. La première aussi, ne serait-ce que pour voir ce que ça fait.

La première me renvoie une erreur.
1
2
3
PUBLIC SUB bouton90_Click()
picRoue.Picture = picRoue.Picture.Image.Rotate(90)
END

Erreur : Type mismatch: wanted picture, got image instead

Est-ce du au fait que je n'ai pas déclaré l'image utilisée dans le code mais directement en cliquant sur le "pictureBox", dans la partie création graphique ?


Oups pardon, c'est une erreur inattention de ma part. Il faut reconvertir l'Image en Picture pour que la PictureBox puisse l'utiliser. Le bon code (pour le premier) est en fait :

1
2
3
PUBLIC SUB bouton90_Click()
picRoue.Picture = picRoue.Picture.Image.Rotate(Pi / 2).Picture
END
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
gambix#6 Posté le 4/11/2012 à 12:43:55
Faire simple !Picbox.picture = himg. Rorate(rad(90)).picture

Je conseille de charger l'image original dans une variable image.
Moins de texte dans une signature c'est agrandir son espace.
Prokopy#7 Posté le 4/11/2012 à 12:48:27
Kinder Pingui
Picbox.picture = himg. Rorate(rad(90)).picture

Je conseille de charger l'image original dans une variable image.


C'est bien ce que j'ai dit. ;)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
1