Problème affichage d'image dans PictureBox
Bonjour,
Je suis en train de développer une petite application en C# dans laquelle j'ai une fenêtre avec un PictureBox où je veux afficher une image. Cette dernière est le résultat d'un traitement qui me donne un graphe orienté et je ne connais pas au préalable la taille de l'image. Au cours de mes tests, j'ai constaté que quand l'image et plus grande que le PictureBox, elle est découpée de chaque coté et ne s'affiche pas par conséquent en entier. j'ai essayé de mettre la propriété SizeMode à "CenterImage", toujours le même problème, à "StretchImage", l'image est agrandie sur toute la surface de le PictureBox ce qui n'est pas adapté pour les petites images, et à "Zoom" qui a à peu près le même effet que "StretchImage".
J'ai essayé aussi de mettre le PictureBox dans un Panel et j'ai défini sa taille comme celle du Panel. Ensuite j'ai mis Autoscroll = true mais ça n'a rien donné, l'image est maintenant coupée dans le Panel. En plus j'ai essayé de redimensionner la PictureBox avec la même taille que l'image, ça marche bien, avant j'avais le coté gauche coupé, mais maintenant l'image commence de la gauche, c'est le reste de l'image à droite et en bas qui est coupé, et les barres de défilement du panel ne s'affichent pas.
Aidez moi s'il vous plait, j'ai presque tout essayé et je galère là
Je vous remercie d'avance pour vos suggestions.
probleme d'affichage d'image ,echelle
bonjour ,
voici une astuce :
-dans l'evenement Paint de picturebox,rafraichit l'image en la redessinant et pour l'echelle utilise scaletranform couple à un trackbar comme ca peut importe la taille ,le scaletransform va te permettre d'avoir un viewport independant de la fenetre du picturebox(de l'ecran).
ainsi tu zoom si le graphe est grand, tu dezoom s'il est petit.
treves de parlote voici le code,DrawingArea c'est le canvas:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
Private Sub DrawingArea_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles picAireDessin.Paint
' ----- Rafraichit la zone de dessin.
'
' ----- Efface Tout dans le PictureBox.
e.Graphics.Clear(Color.White)
' ----- Met a l'echelle suivant requete Utilisateur(facteur DisplayScale).
'------trcAfficheEchelle c'est trackbar
e.Graphics.ScaleTransform(trckAfficheEchelle.Value, _
trckAfficheEchelle.Value)
' ----- Recharge l'image(nouvelleImage c'est ton image)
e.Graphics.DrawImage(nouvelleImage, 0, 0)
' ----- Liberes ressources GDI.
principalFont.Dispose()
titreFont.Dispose()
End Sub |
tout le probleme va etre de fixer ton viewport reel(qui depend de la taille reelle de ton image).
la regle :
- value de trackbar =1 et minimum=1 correspondent a un facteur d'echelle 1(zoom:1) c'est a dire la matrice scaletransform(1,1) laissent width et height reel de l'image.
- maximum =50(exemple) correspondent a un facteur d'echelle 50(zoom 50) c'est a dire la matrice scaletransform(50,50) multiplie width et height reel de l'image par 100.
evidemment il faut trouver le compromis parce que un ecran de 800*600 c'est une surface limite et il ne faut pas chercher à y afficher un graphe de 100m x100 m.
a ce moment divise par un facteur tes unites absolues de calcul des coordonnees.
anecdote :
le fameux charles petzold le createur de windows,dans les blogs msdn ,repondait plaisament et poliment a une personne qui avait fait une grande carte et qui ne la voyait sur son ecran, ceci: mois aussi malgre que j'ai chez moi un grand ecran 22 pouces je ne la vois pas egalement.....pour vous dire qu'un ecran est un ecran avec ses dimensions et il faut utiliser le moyen approprie ,la loupe dans certaines situations.
bon code et bonne annee.....
-
taille d'image et picturebox
bonjour ,
Ceci fonctionne bien en ajustant la taille d'image a la taille du panel.
Mais donnera des distorsions si c'est une image et un effet deseagrable à l'user meme si c'est des figures geometriques,a fortiori une photo.En plus s'il y a beucoup de figures ca va finir par devenir "illisible" indistinguable.
Par contre la methode ScaleTransforme garde les proportions et si l'utilisateur veut voir un detail il peut agrandir l'echelle c.a.d "zoomer".
La methode n'est pas specifique au picturebox,elle s'applique meme si tu crees dessine sur usercontrol ou panel .elle est efficace,c'est le fameux "rasoir d'occam" qui coupe tout.
bonne soiree....