Image et Mémoire

Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 - 7 août 2005 à 18:08
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 - 7 août 2005 à 21:49
Bonjour tout le monde.

Voila, je me fais une petite appli en C# et je suis amené a utiliser une grosse image (1500*1500) que je peux dragger pour centrer sur telle ou telle zone de l'image (car forcément elle est plus grande que l'appli) et sur laquelle je peux zoomer/dezoomer.

J'ai donc commencé a mettre une pictureBox dans un panel. Pour le deplacement, je me suis débrouiller en changeant mon pictureBox.Location en fonction du mouvement de la souris. Je suis pas sur que ca soit la meilleure solution, mais ca marche pas trop mal comme ca.

Mon problème vient surtout lors du zoom/dezoom:
en gros je fais:

Size newSize = img.Size * zoomLvl;
pb.Image = new Bitmap(img, newSize);

Le truc c'est qu'a dezoom, passe encore, mais lorsque je zoom, ca monte très très facilement à 300MB de ram consommée, voire plus et par la même occasion, à limite faire freeze l'ordi.

J'ai pas réussi à trouver d'autres méthodes pour gérer un zoom sur une image, alors si vous avez d'autres idées...

Note: l'image est en réalité une carte sur laquelle par la suite je devrais indiquer certaines positions.

Merci d'avance.

6 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 août 2005 à 18:20
Salut,

Déjà je te conseillerais plutot de faire ceci :

Size newSize = img.Size * zoomLvl;
if ( pb.Image != null )
{
pb.Image.Dispose();
}
pb.Image = new Bitmap(img, newSize);

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Fildomen Messages postés 805 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 30 octobre 2010
7 août 2005 à 18:23
Vaut mieux de zomer que la partie que tu dois afficher, pas toutes l'image et montrer la partie que tu dois afficher. sinon 300 mb c'est trop, pkoi tu change pas la propriété du picture boxe, le SizeMode a strechImage, et comme ca, tu ne fé que changer le width et le height du picturebox

YaoYao !!
1 + 1 = 10
0
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 2
7 août 2005 à 19:22
Deja, merci beaucoup pour la rapidité des réponses.

@Coq:
Effectivement, j'aurai pu y penser moi même de libérer manuellement les ressources . Ca améliore un peu mais même, je crois que ma méthode à la base n'est pas forcément la meilleure. Le problème c'est que j'affiche qu'une partie de la carte (environ 800*600) mais que l'image qui peut monter a 9000*9000 et donc quand même prendre trop de place en mémoire.


@Fildomen:
Oui je pense qu'il faut que je me dirige vers quelque chose comme ca. Le truc c'est que j'emule une sorte de scrolling lorsque je 'drag' l'image, donc il faut quand meme que j'ai l'image en entière lors du déplacement.


Je crois qu'il faut que je reprenne la méthode. Je pense à un truc du genre
le bitmap taille réelle en mémoire,
un bitmap de la taille du panel qui sera un rognage de facon à ne gérer que ce qui est censé etre visible.
Je ne sais pas encore comment je vais faire ça mais je vais me pencher dessus
0
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 2
7 août 2005 à 19:30
Edit:
J'ai tester la méthode de Filodmen, et ca marche niquel en fait. (Jusqu'a l'erreur: System.ComponentMode.Win32Exception: Opération réussie que j'ai trouvé marrant quand même)
Bon, je vais débugguer ca maintenant ^^

Merci beaucoup pour votre aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Fildomen Messages postés 805 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 30 octobre 2010
7 août 2005 à 21:17
po2koi, j'ai recherché sur cette erreur mais je n'ai rien trouvé d'interressant,si t'arrive pas à la regler,n'hesite pas à nous la demander

Bonne chance...

YaoYao !!
1 + 1 = 10
0
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 2
7 août 2005 à 21:49
L'erreur était du à trop fort zoom: la pictureBox était trop grande. Suffit de limiter le zoom est c'est réglé.
0
Rejoignez-nous