Dks_gestion_image 1.0 : accèlèrer le traitement des images : 30 fois plus rapide !

Soyez le premier à donner votre avis sur cette source.

Vue 9 946 fois - Téléchargée 1 733 fois

Description

Ce module de classe vous permet d'accèlèrer le traitement des pixels sur une image complète. Le gain est de l'ordre de 30 à 35 fois plus rapide sur un Athlon XP 2400+ ! Cependant, le gain est surtout réel pour le traitement d'une image complète et non quelques pixels ! En plus, ce gain est obtenu pour un programme compilé, et non lorsque le programme est éxecuté sous VB (à ce moment là, le gain retombe à environ 5 fois plus rapide).

En fait, les fonctions de la classe s'utilisent presque aussi simplement que les fonctions API GetPixel et SetPixel à quelques différence : il faut tout d'abord lui donner le DC contenant l'image à manipuler :
Dim OBJ_Image As New CLS_GESTION_IMAGE 'stocke l'objet de gestion d'image
Call OBJ_Image.Image(Picture1.hdc, Picture1.ScaleHeight, Picture1.ScaleWidth)

Ensuite, il suffit d'appeler les fonctions GetPixel et SetPixel de cette façon :
LNG_Couleur = OBJ_Image.GetPixel(LNG_for1, LNG_For2)
Call OBJ_Image.SetPixelRGB(LNG_for1, LNG_For2, vbBlue)

Bien entendu, il y a un truc pour obtenir une meilleure performance que les fonctions API : j'évite de charger à chaque fois l'image lors d'un GetPixel contrairement à la fonction GetPixel de l'API, et j'évite de raffraichir l'affichage contrairement à la fonction SetPixel de l'API, d'où ces résultats !

De plus, la version RGB de SetPixel est encore plus rapide car le calcul pour obtenir les composantes RGB n'est plus nécéssaire !

Cette classe est très intéressante pour des programmes de retrouches graphiques, car ca permet de faire des manipulations sur les pixels d'une image très rapidement !

Mise à jour de cette source pour rajoutter un fonction GetPixelRGB qui est plus rapide que la fonction GetPixel, ainsi que la correction d'un bug au niveau de l'autosize d'un picturebox.
Mise à jour à nouveau de cette source pour corriger quelques bugs : avec l'ancienne version, certains pixels n'était pas à la bonne place si les picturebox avait une bordure !
Nouvelle mise à jour pour optimiser la compilation : on y gagne pas mal ! De plus, j'ai enlever les routine de traitements d'erreurs pour y gagner encore plus ! Dorénavant, ca tombe en dessous des 70 ms ! Elle devient donc de plus en plus rapide, mais attention : dorénavant, les erreurs ne sont plus gérées (vous pouvez très bien remettre la gestion des erreurs en enlevant les commentaires dans le code), donc gare au crash du prog !

Source / Exemple :


'all in the zip

Conclusion :


Cette classe va me permettre de faire progresser les projets que j'ai déjà mis en ligne, et d'en faire de nouveaux pour des applications graphiques.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cdelory
Messages postés
39
Date d'inscription
mercredi 7 mars 2012
Statut
Membre
Dernière intervention
26 septembre 2012
-
Bonjour DARKSIDIOUS,
je suis débutant et j'essai d'approcher le traitement d'image ( pour le plaisir ).
J'utilise la bonne vieille methode dite "lente"... et c'est vrai que c'est hyper lent !!
Alors j'ai essayé ton prog, mais il ne tourne pas en vb.net ... je suis dégouté, et j'ai pas le niveau pour le debugger.
Est ce que tu as un exemple de cette technique "ultra rapide" qui tourne sur vb.net ?
Merci
cs_DARKSIDIOUS
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
82 -
Padyven : ta fonction (set/getbitmapbits) est l'ancienne version du get/setdibits qui est utilisé dans ma source. Elles (get/setdibits) permet bien plus de chose que get/setbitmapbits !

Et je te rassure, ma source permet de travailler directement sur le tableau de bits en mémoire, et non de charger à chaque fois le tableau pour faire un traitement comme doit le faire GetPixel/SetPixel !
Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
y'a plus rapide encore, hacker ton tableau de bits pour qu'il pointe sur la zone mémoire du Bitmap...
(SafeArray & Co)
PADYVEN
Messages postés
69
Date d'inscription
lundi 10 février 2003
Statut
Membre
Dernière intervention
29 août 2012
-
C'est peut etre ca

Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long

ca permet de copier tous les bits d'une image dans un buffer
apres ya qua faire du refresh
PADYVEN
Messages postés
69
Date d'inscription
lundi 10 février 2003
Statut
Membre
Dernière intervention
29 août 2012
-
Il existe une API qui charge tout le tableau de couleur d'une image et qui permettrai encore plus d'accellerer le traitement
evidement une autre api permet de le restituer equivalent de bitblt
Desole je retrouve pas le nom

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.