DKS_GESTION_IMAGE 1.0 : ACCÈLÈRER LE TRAITEMENT DES IMAGES : 30 FOIS PLUS RAPIDE

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 3 mai 2004 à 15:24
cdelory Messages postés 39 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 26 septembre 2012 - 21 août 2012 à 18:30
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/22490-dks-gestion-image-1-0-accelerer-le-traitement-des-images-30-fois-plus-rapide

cdelory Messages postés 39 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 26 septembre 2012
21 août 2012 à 18:30
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 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
24 oct. 2006 à 15:35
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 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 oct. 2006 à 15:09
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
24 oct. 2006 à 14:59
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
24 oct. 2006 à 14:56
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
DedeSurf Messages postés 156 Date d'inscription mardi 17 décembre 2002 Statut Membre Dernière intervention 23 novembre 2011
12 oct. 2005 à 22:55
Ok sa roule ;)
Je me demande ou tu a trouvé sa :)
Enfin le + important s'es que tu le partage :)
Merci a toi :)=
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
12 oct. 2005 à 22:43
Comme je l'ai précisé : il faut compiler la dll pour obtenir des vitesse d'environ 30x plus rapide, sans compiler, 5x, ca me parait un gain "normal" ;)

Compile ton projet, et tu verra tout de suite la différence !

DarK Sidious
DedeSurf Messages postés 156 Date d'inscription mardi 17 décembre 2002 Statut Membre Dernière intervention 23 novembre 2011
12 oct. 2005 à 22:18
YoOo moi sè 5x plus rapide ;)
les vitesses sont :
Pset = 1954
API = 1750
Toi = 375

Soit apparement 5x plus rapide ;) mais sè trè bien :)
Merci
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
7 oct. 2005 à 23:26
J'ai obtenu 15x / 19x avec mon tout nouveau pentium II celeron 333Mhz 500Mo.

J'en suis encore tout étourdi...

Merci pour le boost!
Gorgot Messages postés 95 Date d'inscription lundi 28 janvier 2002 Statut Membre Dernière intervention 21 février 2008
23 mai 2005 à 07:29
entre 30 et 40x plus pour moi sur un Athlon XP 3200+ 1 Gig Ram. Et puis pour ce qui est des différences entre processeurs ayant la même cadance, c'est très normal. Premièrement, la charge processeur au moment du test y joue pour beaucoup et aussi, si le processeur n'est pas de la même "sorte", il y a souvent de grandes différences au niveau du cache et de l'architecture du processeur. C'est pas pour rien que un Athlon XP soit cadencé à la moitié de la vitesse d'un intel mais qu'il arrive environ aux mêmes performances pareil...

T-K, très bonne source dark, mais tu devrais mettre http://www.progotop.com comme ton site web perso, ça nous aiderais p-e ;)
cqui789 Messages postés 261 Date d'inscription jeudi 13 janvier 2005 Statut Membre Dernière intervention 18 mai 2009 3
15 févr. 2005 à 21:17
Si les noms de variables ne te plaisent pas, utilise CTR-H et remplace les par ceux qui te plaisent.
moi, j'aime bien 'qwe' 'asd' et 'zxc', paske j'ai un clavier US......humour

ce que je reproche aux noms trops complets, c'est qu'ils alongent les lignes qui ne tiennent plus dans la fenetre sans l'ajout de " _"s qui ne facilitent pas nonplus la lecture.

J'ai effectivement tendance a faire comme dit au debut, un remplace quand les noms ne me plaisent pas pandant la phase de comprehension de la sourse, en gardant l'original pour reference.
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
15 févr. 2005 à 19:12
Points de vue que je respecte :-)
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
15 févr. 2005 à 07:01
Heu..., tu ne m'a point énervé, je peux te l'assurer. Désolé si tu m'a trouvé trop "sec", mais c'est ma façon de m'exprimer de temps en temps. Je voulais juste te faire part de ce que je pensais concernant les remarques que tu m'a faites : je ne trouve pas que les convetions de noms que j'utilisaient (j'utilise bien le passé puisque je ne les utilise plus) étaient trop compliquées et incompréhensibles pour devoir refaire toute la source de 0.
Concernant les commentaires, je refuse de séparer les commentaires de leurs fonctions, car sinon, je risque d'oublier de les mettre à jour en même temps que leur source, ce qui est source de confusion pour les utilisateurs !

Pour les techniques utilisées : le principal pour ce genre de source n'est pas de comprendre la technique utilisées, mais de savoir comment elle fonctionne. Si tu devais comprendre toutes les techniques que tu utilise à fond, tu arrêterais de programmer ! Exemple : si tu devais comprendre comment faisait un MessageBox pour s'afficher, tu perdrais beaucoup trop de temps.

De même, les noms des fonctions/propriétés me semblent assez parlantes, et sont standard, et je ne vois pas par quoi les remplacer, et je n'ai pas intérêt de le faire si je veux garder une compatibilité avec toutes les sources qui se base sur cette classe !

Les règles de codages sont différentes pour beaucoup de monde. Il te suffit de regarder une dizaine de sources, de débutants comme de programmeurs plus confirmés pour t'en rendre compte. Certains adorent donner des noms incompréhensible à leur variable, du style "i" ou "rtn", variables qu'ils utilisent 15 fois dans la même procédure, ce que je trouve très crade. D'autres suivent les standards de microcoft, ce qui est très bien (et j'essaye de plus en plus de l'utiliser, voir mes dernière sources), et d'autres préfère un nom beaucoup plus long, ce qui est mon cas, mais vu que beaucoup de monde me dit que je suis maso à cause de cà, j'essaie d'évoluer (je préfère lire "OBJ_Gestion_Image" plutôt que : "GestIm", je trouve ca plus parlant quand même, surtout si dans ton projet, tu en utilise plusieurs !). Mais ce n'est qu'un point de vue personnel.

DarK Sidious
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
15 févr. 2005 à 02:53
Waou, j'ai "énervé un peu Darky je crois... ;-)

Ce que je voulais dire c'est que ce que tu as marqué juste au dessus (c.f. * * *) devrait être mis au début de la source comme commentaire (afin de s'y retrouvé tout de suite... ben wai, toi tu l'as fait donc tu la connais sur le bout des doigts mais moi, à chaque fois je suis obligé d'aller "chercher" les noms des fonctions/propriétés). Une sorte de "Mode d'Emploi" pour une prise en main rapide...

Et puis, il faudrait p'tetre mettre une brève explication made for newbies comme p.ex. :
"La technique utilisé dans cette class (objet) consiste à récupérer d'un coup tous les pixels de l'image via une API (function) de Windows pour les mettre dans une sorte de tableau afin de les modifier rapidement. Une fois modifiés, il suffit de rafaîchir l'image pour afficher tous les changement d'un seul coup...
Et cela afin d'éviter de récupérer, modifier puis afficher un à un chaque pixel ce qui est nettement plus long en temps processeur."

[enfin, si j'ai bien compris !?!?]

Bon, moi je dis ça parce que tu l'as mise en niveau "Débutant"...


En revanche, je ne suis pas d'accord avec ton approche du nommage... En effet, dans la MSDN (et dieux seul sait a quel point elle représente une "bible" pour certains Admins ;-), il y a, dans la rubrique :
-> "Utilisation du Visual Basic"
L> "Guide de l'utilisateur"
L> "Conventions de codage de Visual Basic"
tout ce qu'il faut... C'est d'ailleurs, pour changer, court et compréhensible par tous (je dis "pour changer" parce que certaines rubriques sont complètement innacessibles aux débutants...)

Alors, pour commencer :
1) Je trouve que ce n'est pas une bonne idée d'utiliser les noms "standard" par défaut... Parce que l'utilisateur peut rapidement faire des confusions (surtout tard dans la nuit... vous savez...). Moi je suis pour l'ajour de préfixs ou de suffixes comme, par exemple, "dksSetPixel"... Bon d'accord, il y a l'objet... Mais la propriété "PictureBox" est un peu comme les éléphants... elle trompe énormément !!!

2) Je ne suis pas pour l'utilisation des "_" qui, je trouve, alourdissent le visuel du code... Mais c'est perso!

3) Je ne suis pas partisant pour mettre les types des variables en préfix... Je préfère les suffixes car, après tout, c'est la dernière info dont on a besoin en lisant le code (enfin, pour ceux qui lisent de doirte à gauche...). Je crois que c'est très secondaire (mais très important aussi, attention, j'ai rien dis...) face au "bidule" utilisé (p.ex. function, procédure, variable globale, locale, objet, controle, ...) et au nom. Bon, je dis ça en contradiction avec la MSDN mais... Par exemple :

Declare Type typLeNomDuType
...
tblBitsRGB(0 to 0)

Private Sub mthRefresh()
Private... prtPictureBox ou ptyImage

varMaVariableLng ou varMaVariable_lng

...
...
...


Et sinon, pour finir, "clsGestionImageDks" me semble plus approprié non !?!?


: MESSAGE A TOUS LES LECTEURS :

Donnez nous aussi votre avis histoire de calmer le jeu et pour ne pas énerver LE GRAND DARKSIDIOUS MAÎTRE ABSOLU DE L'INFINITÉ SPACIO-DIMENSIONNELLE DE L'UNIVERS afin qu'il ne détruise pas, avec sa NOIR ETOILE, ma si zolie et si chtite planète un peu trop grise... Unissons nous tous ensemble afin de sauver le peuple des Newbies en vois d'extinction pour cause de CSVBware...

[ça y est, j'ai fini mon délire... oups, les infirmiers sont déjà là... nooonn, vous ne m'emporterez paaasss........]


Mea-culpa :
Bon, je sais que je suis un peu "casse-couille" avec toutes mes remarques et mes posts qui n'en finissent pas... je suis peut-être trop perfectionniste envers les autres et pas assez envers moi-même... mais je veux juste aider un peu... c'est tout...
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
14 févr. 2005 à 06:55
Tant fait pas, les remarques, tant qu'elles sont constructives, ne me dérange pas, bien au contraire, si ca peut contribuer à améliorer les sources !

Il n'existe pas tant de fonction que cà ! Dans l'ordre, ca donne :
* GetPixel qui permet de récupèrer la couleur d'un pixel, comme le fait la fonction de l'API Windows, mais en plus rapide.
* GetPixelRGB qui fait la même chose que GetPixel, mais en renvoyant les 3 composantes RVB dans les paramètres passés en référence.
* Propriété PictureBox qui permet de définir le picturebox dans lequel est contenu l'image à traîter
* Refresh qui permet de raffraichir l'affichage (appliquer les modifications dans le picturebox)
* SetPixel qui permet de définir la couleur d'un pixel, comme le fait la fonction de l'API Windows, mais en plus rapide.
* SetPixelRGB qui permet de définir une couleur en lui passant les 3 composants RVB.

Donc en gros, ca ne fait que 6 fonctions/propriétés publiques qui ont toutes une descriptions en commentaires, avec en plus les paramètres à leur envoyé commentées... donc je ne vois pas trop où tu ne t'y retrouve pas, surtout qu'il s'agit de nom standard pour ces fonctions, et non des noms complètement fantaisistes comme on le voit trop souvent sur certaines sources !

Les techniques employées ? J'utilise un tableau de bits : je charge une fois pour toute le tableau de bits d'une image, et je travaille dessus. Mais il me semblait l'avoir commenté dans la description de ma source...

Les variables ne sont pas très explicites : là encore je ne suis pas d'accord avec toi, il s'agissait de mon ancien système de nomenclature, et qui me paraît encore bien plus explicite que la notation hongroise que j'utilise maintenant pour utiliser la notation que "tout le monde est censé utilisé", mais perso, je préfère lire : "LNG_Couleur" qui veut dire : une couleur de type Long, plutôt que "Color" voir même "C" comme on le voit trop souvent !
Un autre exemple : "TYP_Info_Bitmap" est quand même plus parlant que "Bitmap" ou "B"

Pourquoi désactiver la gestion des erreurs ? Fait le test toi même en les réactivant et tu verras : tu y perds pas mal en rapidité ! De plus, les erreurs qui peuvent intervenir sont surtout des dépassements de limites, ce qui est très facile à gérer dans le code d'utilisation : For iFor1 = 0 To Picture1.ScaleWidth ne provoquera pas d'erreur par exemple, alors que : While (True) en provoquera forcément une ! Il suffit d'être rigoureux quand on code, et ca permet d'y gagner environ 1/5 de rapidité en plus !

Je ne demande pas mieux de la populariser, mais beaucoup qui viennent la voir disent : elle est trop compliquée pour moi (toi le premier donc ;), et pourtant c'est faux : elle est aussi facile à utiliser que d'utiliser les fonctions de l'API Windows GetPixel ou SetPixel ! Maintenant, il faut savoir utiliser les classes, mais avec le programme d'exemple que je donne, il est facile de voir comment s'en servir !

Perso, je l'utilise dans tout mes projets qui nécéssite un traitement d'image, et je peux te dire qu'elle est bien plus rapide à utiliser que les fonctions de l'API une fois qu'on a compris comment elle fonctionne (plus besoin de déclarer les fonctions de l'API, de s'embrouiller avec les autoredraw et les refresh, etc.).

Sinon, je ne pense pas que le fait de la renommer permette de la rendre plus populaire. Qu'elle s'appelle dksGestionImage, DKS_Gestion_Image ou encore GestionImage ou Image tout court, ca ne change pas son utilité...

DarK Sidious
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
13 févr. 2005 à 22:32
Salut Draky (tu me dis si ce petit sobriquet [gentil] te dérange ;-),

Je trouve ta source un peu "foutraque" sauf tout l'immense respect que j'ai pour toi et elle.

Je m'explique : je trouve qu'il manque une explication (au début) sur les techniques employés (résumé en somme) ainsi que la liste des fonctions (parce qu'on a parfois, malgrès la petite taille, du mal à s'y retrouver...).

Pi les variables ne sont pas très explicites je trouve...

De plus, je m'intéroge sur le pourquoi de la désactivation des gestionnaires d'erreur !!!


Mais bon, c'est un avis qui n'engage que moi...
Je dis ça parce que c'est dommange de ne pas en faire une source "parfaite" parce qu'elle est super utile !!!!!!!!!!! Moi je crois qu'il faudrait la rendre plus populaire en l'améliorant (et pourquoi pas en la renommant ;-)...

A part ça, 10/10, comme d'hab, parfait [ou presque ;-] !
madbob Messages postés 285 Date d'inscription dimanche 14 décembre 2003 Statut Membre Dernière intervention 13 mars 2012
31 janv. 2005 à 15:15
Je ne te savais pas aussi sentimentaliste... ;-)

C'est plutôt rare chez les jeunes cet état d'esprit vis à vis du code.

Encore une fois bravo, aussi pour la précision de style et l'orientation définitivement objet de ta classe avec les methodes construction/destruction.

Bon là je passe à la fraiseuse
à plus
madbob
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
31 janv. 2005 à 15:07
oh, il ne s'agit que d'une habitude que j'ai prise récement : le Let était disponible dans le bon vieux BASIC, bien avant le VB. Cela évite surtout de déclarer des variables sans le savoir (un peu comme l'Option Explicit).

C'est plus pour une présentation générale du code (Let pour des valeurs, Set pour des objets) qu'autre chose !

DarK Sidious
madbob Messages postés 285 Date d'inscription dimanche 14 décembre 2003 Statut Membre Dernière intervention 13 mars 2012
31 janv. 2005 à 14:54
Tu n'as pas besoin de me justifier la grande qualité de ton travail ;-)

A ce propos...
l'usage du Let c'est pas commun ça ?

Plus exactement (j'ai fait l'école buissonnière), son usage ? Dans l'aide j'ai pas trouvé ça clair mon Anglais peut-être ;-)

Pour les perfs la memoire n'est pas en cause j'ai ce qu'il faut... C'est mon proc atlon 800

madbob
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
31 janv. 2005 à 14:42
Ben pour ce genre de source, le principal intérêt reste l'utilisation de la classe, et non une jolie interface ;)

C'est bon à savoir que la différence de performances et moindre sur un PC un peu plus ancien !

DarK Sidious
madbob Messages postés 285 Date d'inscription dimanche 14 décembre 2003 Statut Membre Dernière intervention 13 mars 2012
31 janv. 2005 à 14:06
Bin ca y est j'ma tapé la cerise sur la gâteau...

J'obiens un 12x / 14x en mode compilé pour un balayage de couleur spécifique ...

L'en faut pas plus à mon DynoPC pour être happy, je peux pas faire grand chose sontre son hasme.

BRAVO je vais plus réfléchir à cette approche !!!

Parcontre pour l'interface on peut pas dire que tu te sois vraiment laché ;-))))

Merci Dark Sidious pour cette étude de cas totalement maîtrisée.

A très +
madbob Messages postés 285 Date d'inscription dimanche 14 décembre 2003 Statut Membre Dernière intervention 13 mars 2012
15 janv. 2005 à 12:33
Bonjour,

Je viens de télécharger la classe....
Je vais regarder ça... très bientôt.

Et je vous tiens au courrant vu les questions concernant la rapidité qui explose avec la puissance, comme j'ai un dynosaure athlon800 + ati allwonder avec 384MO de ram on pourra peut être lever ensemble un voil sur la préhistoire :-)))

A+
madbob
benbedo Messages postés 16 Date d'inscription lundi 13 septembre 2004 Statut Membre Dernière intervention 3 décembre 2004
3 déc. 2004 à 14:17
merci, ca va bien me servir... j'ai 22x d'accélération sur un p4 1.5Gh 256Mo de ram... je test cela dans mon programme...
BozzoDodo Messages postés 185 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 10 janvier 2008
6 nov. 2004 à 12:42
19x plus rapide (1484/78) sur pentium 4 CPU 2.4GHz 256Mo ram winXP
mmmmh jadore cette source!!! :)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 oct. 2004 à 08:45
"(vous pouvez très bien remettre la gestion des erreurs en enlevant les commentaires dans le code)"

tu pourrais utiliser la compilation conditionnelle....

#IF DKS_GESTION_IMAGE_DEBUG THEN
On Error........
#END IF

enfin, ce genre de choses, quoi.....

++
DarkanLeGrd Messages postés 17 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 12 mars 2005
13 oct. 2004 à 19:28
merci pour tes sources si bien commentées, qui nous sont d'une précieuse aide !!! Surtout pour le neuneu que je suis...

ATHLON 1.75Ghz - 1G/Ram = 34x plus rapide que l'API

Darkan
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
29 août 2004 à 18:55
Merci MoiOlivier,

Cette classe permet en fait d'utiliser plus facilement les fonctions GetDIBits et SetDIBits pour obtenir une rapidité plus qu'appréciable pour le traitement d'image. Cela me permet donc de mettre à jour certains de mes projets pour les rendre plus rapides !

DarK Sidious
MoiOlivier Messages postés 172 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 4 août 2005
29 août 2004 à 18:49
Salut,

Oups ! J'arrive avec une guerre de retard.
Pour commencer : 20 x plus rapide que les api chez moi (P4 1.6 GHz).
Je comprends pas comment j'ai pu louper cette source jusqu'ici. J'étais justement en train de faire exactement la même chose. Et comme j'ai horreur de réinventer la roue, ça tombe bien, j'arrête : j'ai trouvé ce dont j'avais besoin.
Merci Darksidious !

PS : pour ceux qui (comme moi) vont réutiliser cette classe, ne pas oublier de cocher toutes les cases dans Projet>Propriétés de... >Onglet Compilation > Bouton Optimisations avancées. Sinon, c'est plus lent.

Bravo.
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
19 août 2004 à 21:32
Ben ... avec la Dll Glax ...non ?
Vu la légendaire gentillesse d'EB ... (C meme un GentlemanBasic Extraordinaire ... ya plus k'a kréer la Ligue ...) Il va surement avoir un avis sur la question !
Je suis sur que ca va dépoter.

(Il vous rajoutera meme quelques copymemory ... c sur)

A plus

Bonne Prog

Afyn
Navedac
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 août 2004 à 19:56
Pour les exemples d'applications : n'importe quel type de manipulation d'image fait l'affaire tant qu'on se limite à définir les couleurs de pixels. Par exemple : la fusion de deux images, la copie avec couleur de transparence (j'ai fait deux source à ce sujet) ou autre. Sinon, on peut également l'utiliser pour ombrer des contrôles dans une feuille ou découper un feuille rapidement en créant des régions (là aussi, j'ai fait des sources sur ce sujets).

Je contacte EB pour avoir son avis sur les liens avec une dll optimisée... en C pourquoi pas... ;)

DarK Sidious
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
19 août 2004 à 17:18
Faudrait voir avec EBArtSoft si en linkan une DLL optimisée on gagne encore ...
J'en suis preske sur.
Et puis faudrait aussi des exemples d'application.

A+
Afyn
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
19 août 2004 à 03:45
Piou la différence est hallucinantes rien qu'a vue d'oeil, c'est impressionant. Chez moi P4 2.4Ghz WinXP 512Mo mémoire vive :
27x plus rapide que les api (2703/94)

Bah la bravo !
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
18 août 2004 à 18:49
Nouvelle mise à jour du prog avec optimisation en enlevant les gestions d'erreurs et en faisant une compilation plus optimisée niveau vitesse. On atteint les 70 ms contre 1950 ms pour les API classique GetPixel/SetPixel ! Je me rapproche donc de GFlax qui lui traite les pixels avec un seul appel de fonction (donc un procédé plus rapide en théorie).

DarK Sidious
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
29 juil. 2004 à 14:13
Source mise à jour pour corriger le bug avec les picturebox contenant une bordure.

Gestion des images en 32 bits également... ca peut toujours servir sans toutefois afficher les images avec des niveaux de transparence... pour le moment ;)

Ajout du parcours de l'image avec Pset et Point pour comparer

Arnor2000 : Avec SetPixelV, j'obtiens des performances moindre... pas normal !!!

DarK Sidious
Arnor2000 Messages postés 32 Date d'inscription mercredi 17 mars 2004 Statut Membre Dernière intervention 24 novembre 2004
7 juil. 2004 à 14:26
Sur mon AthlonXP 1800+ avec 512mo de DDR j'ai 1750 contre 141 soit 12X...

Je me demande aussi s'il ne vaut mieux pas utiliser SetPixelV qui ne retroune qu'un booléen au lieu de retourner la couleur qu'il a appliqué en long...
Ce serait plus juste je pense car le SetPixel que tu fait lui renvoie soit 1 soit 0...

Arnor
cs_mehdibou Messages postés 365 Date d'inscription vendredi 24 mai 2002 Statut Membre Dernière intervention 18 octobre 2004
1 juil. 2004 à 14:38
Afyn:
>>Y a t-il une méthode qui permettrait d'accélerer l'affichage ou le rafraichissement des Controls VB (un label ou une ListView) ?
DarK Sidious:
>>Je ne pense pas que ce soit possible vu qu'on ne peut pas intercepter leurs appels aux API pour les réorienter, en tout cas, je pense pas !

Il y a un moyen, qui consiste à indiquer (à la création du contrôle) que l'on va traiter nous-même l'affichage des contrôles (style OWNERDRAW), ensuite des événements sont générés par l'appel à la WindowProc (pour le faire en VB, il faudrait faire un sous-classement), ce qui permet entre autres de dessiner ce que l'on veut comme controle . Mais je ne pense pas que l'on puisse vraiment accélérer ceci (surtout en VB !) car les fonctions de User32 et Gdi32 sont déjà bien optimisées.


DarK Sidious:
>>Dommage que ce soit une dll développée en C : le gain de performance se justifie par l'utilisation de ce langage aussi...si ca se trouve, ma source en C ferait mieux... lol. Faudras que j'essaie lorsque j'aurais plus de connaissance en C ;-)

C'est clair, si tu veux un peu d'aide pour le faire en C, n'hésite pas à me demander :)


DarK Sidious:
>>Finalement, c'est pas si rapide que cà !

Il faut prendre en compte également que les appels d'API par VB sont particulièrement lents comparés à d'autres langages.


Et enfin, mon test :
5297/684 = 8x sur mon AMD K6-II 450MHz
(2x en non-compilé)
aj33 Messages postés 8 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 5 février 2020
9 mai 2004 à 10:47
Tout à fait d'accord avec tes remarques.
En attendant de trouver mieux je continue avec Gflax
car c'est une librairie simple de mise en oeuvre
avec une syntaxe claire, pour mes besoins il lui manque
des fonctions pour ré-écrire des infos exif dans les fichiers images
je me débrouille avec d'autres dll, mais cela serait plus simple avec une seule libairie rapide pour ne pas avoir à jongler avec des objets ou classes images qui ne partagent pas les mêmes propriétés.
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
9 mai 2004 à 10:24
Finalement, c'est pas si rapide que cà ! C'est même aussi rapide : 109 ms chez moi, mais avec un code différent du tiens :

Le code que tu utilise permet d'avoir un meilleur score grâce notamment à l'utilisation d'une seule fonction appliquée une seule fois pour traiter toute l'image. Le but de cette source c'est de récupèrer chaque pixel un à un et de les modifier un à un pour montrer la différence avec GetPixel et SetPixel.

Donc, si on reprend ta librairie, le code équivalent devient :

PCT_TEST.Picture = LoadPicture(App.Path & "\test.bmp")
TickCount3 = GetTickCount
Set ImageGflax = New GflAx.GflAx
ImageGflax.LoadBitmap App.Path & "\test.bmp" 'Load the file
For LNG_for1 = 0 To PCT_TEST.ScaleWidth - 1

For LNG_For2 = 0 To PCT_TEST.ScaleHeight - 1

LNG_Couleur = ImageGflax.GetColorAt(LNG_for1, LNG_For2)
If LNG_Couleur = 0 Then Call ImageGflax.DrawPoint(LNG_for1, LNG_For2)

Next LNG_For2

Next LNG_for1
PCT_TEST.Picture = ImageGflax.GetPicture
PCT_TEST.Refresh
Set ImageGflax = Nothing
TickCount3 = GetTickCount - TickCount3

MsgBox TickCount3

Et à ce moment là, tu remarquera qu'on obtient des résultats semblable entre les deux méthodes !

Cependant, ta librairie est bien plus complète que la mîenne, et elle est bien utile ! Je la garde sous la main car elle va sûrement me servir ! Merci de me l'avoir faîte découvrir

DarK Sidious
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
9 mai 2004 à 10:05
Vraiment imprésionnant comme rapidité ! Je vais la regarder de plus près cette dll ! En plus, elle est gratuite ! Dommage que ce soit une dll développée en C : le gain de performance se justifie par l'utilisation de ce langage aussi... si ca se trouve, ma source en C ferait mieux... lol. Faudras que j'essaie lorsque j'aurais plus de connaissance en C ;-)

DarK Sidious
aj33 Messages postés 8 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 5 février 2020
9 mai 2004 à 09:58
Tu fais une recherche sur google avec Gflax et tu as tous les liens.
Je fais tous mes programmes de traitement d'images avec cette
librairie et je vais bien plus vite qu'avec Photoshop et surtout
je peux construire mes traitements par lots comme je veux.
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
9 mai 2004 à 09:53
GFlax ? C'est quoi cette dll ? ca m'interesse à moi aussi !

DarK Sidious
aj33 Messages postés 8 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 5 février 2020
9 mai 2004 à 09:40
Sur un intel celeron 2 Ghertz avec 1 Giga de mémoire
Via Api = 2500
Optimisé = 125 soit 20X plus rapide.
Mais avec la dll graphique Gflax.dll en faisant
TickCount3 = GetTickCount
Set ImageGflax = New GflAx.GflAx
For i = 1 To 100
ImageGflax.LoadBitmap CheminSource 'Load the file
ImageGflax.ReplaceColor RGB(0, 0, 0), RGB(0, 0, 255)
PictureBox1.Picture = ImageGflax.GetPicture
PictureBox1.Refresh
Next i
Set ImageGflax = Nothing
TickCount3 = GetTickCount - TickCount3
Le gain est encore substantiel car on passe de 125
en optimisé à 25 avec Gflax soit encore 5 fois plus rapide.
A l'heure actuelle je cherche des dll graphiques libres de droits
plus rapides que Gflax mais c'est difficile à trouver.
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
6 mai 2004 à 20:36
Source mise à jour pour régler un petit problème mais qui était plutôt gênant : l'autosize ! Dans l'ancienne version, l'algorithme pour se positionner dans l'image n'était pas bon si le PictureBox n'était pas de la même taille que l'image... gênant ! Là, cà à l'air de marcher ! J'ai en plus rajoutté un fonction getPixelRGB qui permet d'obtenir de meilleurs résultats encore en évitant l'appel à la fonction RGB de VB. De plus, j'ai dû modifier un peu l'interface de la classe pour pouvoir récupèrer un PictureBox en paramètre et non plus un hDC.

DarK Sidious
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
5 mai 2004 à 07:55
J'ai essayé avec différentes tailles d'images (de 320*184 à 1000*575) et le rapport reste le même chez moi, avec la picturebox en "autosize"

++
moustachu
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
4 mai 2004 à 19:11
Très bien, merci Neo.balastik : même sur les P4 HT, l'écart reste le même, c'est bon à savoir !
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
4 mai 2004 à 17:24
Sur mon Intel P4 3Ghz HyperThreading 1Go RAM , j'obtiens ceci :
Via API : 2000
Via calcul optimisé : 94
Soit 21x plus rapide.
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
4 mai 2004 à 09:27
Oui, l'appel de l'API est moins constant car il y a plusieurs appels (deux par pixels en fait) à une dll extérieure, donc le temps peut-être différent), alors qu'avec mes fonctions, étant donné qu'elles sont intégrées dans le code, il n'y a aucun appel externe et donc, temps quasi constant.

Je ne pense pas que la mémoire y soit pour beaucoup, à moins de ne pas en avoir beaucoup !

DarK Sidious
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
4 mai 2004 à 09:22
j'ai 512 de ram également et winxp. Les valeurs que je t'ai données sont celles d'une exécution avec le moins de prog possible en mémoire (j'ai renoncé à supprimer explorer.exe). Si je suis sur le web par ex j'ai 11x.

Le temps mis par API est variable pour moi d'une exécution à l'autre alors que l'autre méthode est stable niveau temps

voilà

Moustachu
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
4 mai 2004 à 09:10
Merci pour cete info ld40, apparement, ca dépend aussi de la marque du proc : Intel doit etre plus optimisé pour les appels des API !

DarK Sidious
ld40 Messages postés 336 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 22 février 2019 1
4 mai 2004 à 08:57
pentium(R) 4 CPU - 2.40GHz - 512 Mo RAM

1703/110 = 15x
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
4 mai 2004 à 08:53
Salut moustachu,

Merci pour cette info ! Donc sur des processeurs inférieurs, le gain de rapidité est moindre apparement. Il faudrait tout de même avoir confirmation avec une autre personne. Ce que je ne comprends pas, c'est que tu obtiens une plus grande rapidité sur un duron 1.2 avec les API que sur un athlon 2.4... bizarre ;-)

Note : la capture n'est pas mise à jour ! J'obtiens chez moi : 2063/94 => 22x plus rapide !

DarK Sidious
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
4 mai 2004 à 08:34
Okkkkk, autant pour moi, c'est trop tôt, j'ai le cerveau qui colle au plafond. Donc, en utilisant l'exe et pas par l'éduteur VB :o/, ça fait du 12X (1913/160) sur duron 1.2.

++
moustachu
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
4 mai 2004 à 08:27
Bonjour tous le monde,
Pour info, sur un duron 1.2, ce n'est que 3X (2013/731) !
Je ne suis pas sûr qu'il y ait la dernière version en ligne.. si ?

++
moustachu
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 mai 2004 à 21:06
Je n'ai jamais dit qu'il fallait absolument utiliser ces fonctions renfield ;-)

De plus, il vaut mieux utiliser les fonctions de l'API si on n'a que quelques pixels à traiter, c'est alors plus rapide, mais sur une image complète, alors ces fonctions sont au combien plus rapide !

DarK Sidious
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 mai 2004 à 20:47
C'est plus rapide que GetPixel et SetPixel, mais personne n'a jamais dit qu'il fallait utiliser ces fonctions à tout prix ;)

disons que cette classe permet d'utiliser GetDIBits facilement...
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 mai 2004 à 18:38
Source mise à jour !

Moins de 110 ms pour traiter une image de 20000 pixels ! C'est très rapide ! Ca rivalise avec Photoshop là ! Bon bien entendu, c'est un traitement basique sur les pixels, mais je ne pense pas qu'on puisse faire beaucoup mieux sans passer par des dll externes !

DarK Sidious
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 mai 2004 à 18:32
Oui, exact Afyn ! Cela permet de gagner un temps considérable, c'est vrai !

Je mets la source à jour de ce pas ! En fait, le DoEvents est surtout utile pour le traitement avec GetPIxel/SetPixel car là, le processeur mets plus de temps, alors qu'avec mes fonctions, il en mets moins, donc il a moins besoin de faire un doevents !

Donc, je les enlève carrément ! L'écart est toujours le même, mais c'est un peu plus rapide !

DarK Sidious
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
3 mai 2004 à 18:22
Re ...
En fait si tu désactive l'autoredraw de la picturebox... le gain des tes focntions n'est que de 2. (Le but c'est de transformer les pixels Noirs
en pixels Bleu.)
Et si tu déplace le DoEvents a l'intérieur de la Première boucle For Next (ce qui suffit largement) tu améliores la vitesse.
Voila les résultats obtenus avec cette deuxième option :
(on regagne de la rapidité ... peut être les instructions sont elles
en cache ...)

-> 581/110 = 5 (à nouveau... mais 20X par rapport au premier jus)

Ca sert a rien de vouloir accélerer l'affichage si l'on reperds du temps dans des DoEvents superflus.
Voilà pour la petite réflexion ...
Re A+
Afyn
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
3 mai 2004 à 17:06
Dommage ... y avait un prog ki faisait ca sur ATARI (NVDI) qui détournait les appels originaux du système pour les remplacer par des routines améliorées ... les gains était des fois de 4 ou 5 sur pas mal de fonction graphique...
Quand tu fais défiller une page word qui contient du texte et des images ... il y a un effet visible du temps d'affichage du au fait surement que word ne veux afficher que la partie visible de la page.
La vitesse d'affichage semble aussi être fonction des perf de la carte graphique...(en 2D ?)
A+
Afyn
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 mai 2004 à 16:36
Eh eh, je m'y attendais à celle-là ;-)

Je ne pense pas que ce soit possible vu qu'on ne peut pas intercepter leurs appels aux API pour les réorienter, en tout cas, je pense pas !

DarK Sidious
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
3 mai 2004 à 16:32
Une autre questions :
- Y a t-il une méthode qui permettrait d'accélerer l'affichage ou le rafraichissement des Controls VB (un label ou une ListView) ?
(puisque l'affichage des Controls fait appel aux API)
A+
Afyn
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 mai 2004 à 16:19
Okay, merci beaucoup pour l'info ! Ce serait bien que pas mal de monde donne ses propres infos pour pouvoir comparer ! Apparement, on obtient les même perf entre un Athlon 2400+ et un Centrino 1,4 !

DarK Sidious
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
3 mai 2004 à 16:16
Pour ton info : Sur un acer Centrino 1,4 -> 2093/420 = 5 fois
A+
Afyn
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 mai 2004 à 16:14
Merci pour tes commentaires Afyn.

Malheureusement, je ne peux pas mettre les deux images côte à côte pour montrer la différence de vitesse : comme je l'ai dit, je joue sur le rafraichissement pour accèlèrer le SetPixel de ma classe => je ne raffraichit qu'une fois que toute les manip sont faîtes => l'image reste noire jusqu'à la fin des opérations, contrairement avec les API !

DarK Sidious
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
3 mai 2004 à 16:10
C'est du travail trés propre et trés bien commenté.
Personnellement j'aurais mis Deux fois la même image cote à cote...
L'une calculée avec optimisation et l'autre sans ...
Ca montrerai mieux les gains en vitesse ...
Encore Bravo !

Afyn
Navedac
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 mai 2004 à 15:24
Ce serait bien que vous me donniez la différence de vitesse sur vos ordinateurs pour faire un comparatif : est-ce que ces fonctions sont plus rapide que les API sur des machines rapides ou sur des machines lentes...

DarK Sidious
Rejoignez-nous