Nouvelle classe Image_Class : traitement trop long...

Résolu
fsintegral Messages postés 9 Date d'inscription mercredi 10 décembre 2008 Statut Membre Dernière intervention 10 juillet 2013 - 3 janv. 2012 à 17:52
fsintegral Messages postés 9 Date d'inscription mercredi 10 décembre 2008 Statut Membre Dernière intervention 10 juillet 2013 - 4 janv. 2012 à 03:19
Bonjour !

Tout d'abord, Bonne Année à tous !

Puis, la situation :
1) Je suis débutant : je ne sais utiliser que Graphics.
2) Je suis en train de réinventer la roue; je sais que c'est pas bien, mais faut reconnaître que la classe Graphics est difficile à manipuler et très limitée :
J'essaye de faire une (nouvelle) classe Image_Class qui associe directement la classe Graphics et la classe Bitmap dans un seul objet. Ceci fera office de calque et contiendra les methodes de Graphics appliqués à une Image de rendu de cette classe, qu'il suffit de récupérer pour mettre à jour l'image d'un contrôle par exemple.

Le but final :
Créer beaucoup de Image_Class pour manipuler un projet graphique qui fait dans les calques comme le ferait Photoshop. Mieux, avoir un moteur de manipulation graphique pour de futures applications (vectorielles par exemple) J'en ai un sur le feu et il doit pouvoir délimiter des surfaces sur une carte 2D (zone de verdure, marécages...) tracer des routes (intérêt des courbes de Béziers) placer des repères (DrawEllipse) ou des bâtiments (Surcharge de DrawRectangle avec un angle d'orientation)

Le Problème :
Dépendant de la taille des images et le nombre d'instances de la classe, le rendu final (qui consiste à superposer chaque propriété Image_Class.Image dans l'Image_Class.Image final) prend beaucoup de temps. Par exemple, quand je déplace un point d'une courbe de Béziers, il faut au programme genre 0.4 secondes pour mettre à jour le rendu final, rien qu'en superposant 3 images par méthode native Graphics.DrawImage(blabla)
J'imagine que c'est à cause de DrawImage pour des images de 600px sur 300px.
Je pense que ce sera pire à un point pas possible avec 40 calques de 2048x2048px...

La question (en fait, les questions) :
Comment pouvoir manipuler des images plus rapidement ? (les fusionner à la suite donc)
-> Dans d'autres sujets, on a parlé de handle : ça me fait très peur vu que j'y comprends rien, mais je veux bien m'y pencher si on me faisait une brève description genre "Les Handles pour les nuls.."
-> Doit-on passer par un tableau de pixels ? -> et donc traiter les superpositions pixel par pixel ..ce qui voudrait aussi dire que je devrais recréer les méthodes de base de Graphics (DrawString, DrawEllipse...) pixel par pixel ?
-> GetDIBits c'est quoi ?

Remarques :
1) Je préfère travailler en utilisant seulement la RAM pour le moment. Ce n'est pas la sauvegarde d'un projet en cours qui m'inquiète, mais bien le temps consommé à rafraichir le rendu final dans une form.
2) Ne trouvez-vous pas cela bizarre qu'il semble difficile de trouver une classe toute faite pour modifier rapidement des pixels ou des blocs de pixels de façon ultra rapide ?
3) Je suis en train de bidouiller une méthode pour réduire la taille de chaque image aux limites des premiers pixels valides (non transparents) par la gauche, le haut, le bas et la droite... mais ça n'aide pas de beaucoup.

Merci à tous, que vous répondiez ou pas, c'est déjà sympa d'avoir lu.
Désolé de vous bouffer votre temps.

Karl

3 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
3 janv. 2012 à 19:02
Bonjour,

Tu peux utiliser le DoubleBuffering pour masquer le rafraichissement (voir, un peu améliorer les performances).
Sinon,passer par DirectX ou similaire est peut être plis conseillé dans ton cas.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
3
fsintegral Messages postés 9 Date d'inscription mercredi 10 décembre 2008 Statut Membre Dernière intervention 10 juillet 2013
3 janv. 2012 à 22:52
Bonsoir !

Merci pour la réponse et pour les indications d'amélioration des questions.
J'ai déjà résolu le problème de scintillement mais je pense que je vais repartir d'un tableau de pixels et refaire toutes les méthodes pour améliorer la vitesse.
DirectDraw j'y ai pensé mais j'étais pas très doué dessus (Mon vieux laptop ne supporte que XP et DX9)

^^ En fait je demande un truc trop vague pour avoir de réponse alors je mets quand même réponse acceptée.

Merci pour tout.

Karl
0
fsintegral Messages postés 9 Date d'inscription mercredi 10 décembre 2008 Statut Membre Dernière intervention 10 juillet 2013
4 janv. 2012 à 03:19
Bonjour !

Désolé du double post, mais j'ai trouvé ce qui explique un bon nombre de questions que je me pose et ceci contient presque toutes les réponses :

Tapez le texte de l'url ici.

^^ juste au cas où un autre poserait des questions comme j'en ai faites là haut, ce serait sympa de le rediriger sur cette page...

Merci.

Karl
0
Rejoignez-nous