DKS_GESTION_IMAGE 1.0 : ACCÈLÈRER LE TRAITEMENT DES IMAGES : 30 FOIS PLUS RAPIDE
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013
-
3 mai 2004 à 15:24
cdelory
Messages postés39Date d'inscriptionmercredi 7 mars 2012StatutMembreDernière intervention26 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.
cdelory
Messages postés39Date d'inscriptionmercredi 7 mars 2012StatutMembreDernière intervention26 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és69Date d'inscriptionlundi 10 février 2003StatutMembreDernière intervention29 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és69Date d'inscriptionlundi 10 février 2003StatutMembreDernière intervention29 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és156Date d'inscriptionmardi 17 décembre 2002StatutMembreDernière intervention23 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és156Date d'inscriptionmardi 17 décembre 2002StatutMembreDernière intervention23 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és201Date d'inscriptionmercredi 25 septembre 2002StatutMembreDernière intervention10 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és95Date d'inscriptionlundi 28 janvier 2002StatutMembreDernière intervention21 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és261Date d'inscriptionjeudi 13 janvier 2005StatutMembreDernière intervention18 mai 20093 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és1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 15 févr. 2005 à 19:12
Points de vue que je respecte :-)
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 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és285Date d'inscriptiondimanche 14 décembre 2003StatutMembreDernière intervention13 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és285Date d'inscriptiondimanche 14 décembre 2003StatutMembreDernière intervention13 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és285Date d'inscriptiondimanche 14 décembre 2003StatutMembreDernière intervention13 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és285Date d'inscriptiondimanche 14 décembre 2003StatutMembreDernière intervention13 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és16Date d'inscriptionlundi 13 septembre 2004StatutMembreDerniè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és185Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention10 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és17Date d'inscriptionlundi 5 avril 2004StatutMembreDernière intervention12 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és172Date d'inscriptionmardi 15 juillet 2003StatutMembreDerniè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és608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 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és2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és32Date d'inscriptionmercredi 17 mars 2004StatutMembreDernière intervention24 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és365Date d'inscriptionvendredi 24 mai 2002StatutMembreDernière intervention18 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és8Date d'inscriptiondimanche 23 février 2003StatutMembreDerniè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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és8Date d'inscriptiondimanche 23 février 2003StatutMembreDerniè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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 9 mai 2004 à 09:53
GFlax ? C'est quoi cette dll ? ca m'interesse à moi aussi !
DarK Sidious
aj33
Messages postés8Date d'inscriptiondimanche 23 février 2003StatutMembreDerniè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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDerniè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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és796Date d'inscriptionjeudi 17 mai 2001StatutMembreDernière intervention 5 mai 20097 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDerniè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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és336Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention22 février 20191 4 mai 2004 à 08:57
pentium(R) 4 CPU - 2.40GHz - 512 Mo RAM
1703/110 = 15x
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDerniè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és1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDerniè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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 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és608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 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és15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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...
21 août 2012 à 18:30
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
24 oct. 2006 à 15:35
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 !
24 oct. 2006 à 15:09
(SafeArray & Co)
24 oct. 2006 à 14:59
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
24 oct. 2006 à 14:56
evidement une autre api permet de le restituer equivalent de bitblt
Desole je retrouve pas le nom
12 oct. 2005 à 22:55
Je me demande ou tu a trouvé sa :)
Enfin le + important s'es que tu le partage :)
Merci a toi :)=
12 oct. 2005 à 22:43
Compile ton projet, et tu verra tout de suite la différence !
DarK Sidious
12 oct. 2005 à 22:18
les vitesses sont :
Pset = 1954
API = 1750
Toi = 375
Soit apparement 5x plus rapide ;) mais sè trè bien :)
Merci
7 oct. 2005 à 23:26
J'en suis encore tout étourdi...
Merci pour le boost!
23 mai 2005 à 07:29
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 ;)
15 févr. 2005 à 21:17
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.
15 févr. 2005 à 19:12
15 févr. 2005 à 07:01
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
15 févr. 2005 à 02:53
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...
14 févr. 2005 à 06:55
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
13 févr. 2005 à 22:32
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 ;-] !
31 janv. 2005 à 15:15
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
31 janv. 2005 à 15:07
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
31 janv. 2005 à 14:54
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
31 janv. 2005 à 14:42
C'est bon à savoir que la différence de performances et moindre sur un PC un peu plus ancien !
DarK Sidious
31 janv. 2005 à 14:06
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 +
15 janv. 2005 à 12:33
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
3 déc. 2004 à 14:17
6 nov. 2004 à 12:42
mmmmh jadore cette source!!! :)
14 oct. 2004 à 08:45
tu pourrais utiliser la compilation conditionnelle....
#IF DKS_GESTION_IMAGE_DEBUG THEN
On Error........
#END IF
enfin, ce genre de choses, quoi.....
++
13 oct. 2004 à 19:28
ATHLON 1.75Ghz - 1G/Ram = 34x plus rapide que l'API
Darkan
29 août 2004 à 18:55
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
29 août 2004 à 18:49
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.
19 août 2004 à 21:32
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
19 août 2004 à 19:56
Je contacte EB pour avoir son avis sur les liens avec une dll optimisée... en C pourquoi pas... ;)
DarK Sidious
19 août 2004 à 17:18
J'en suis preske sur.
Et puis faudrait aussi des exemples d'application.
A+
Afyn
19 août 2004 à 03:45
27x plus rapide que les api (2703/94)
Bah la bravo !
18 août 2004 à 18:49
DarK Sidious
29 juil. 2004 à 14:13
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
7 juil. 2004 à 14:26
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
1 juil. 2004 à 14:38
>>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é)
9 mai 2004 à 10:47
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.
9 mai 2004 à 10:24
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
9 mai 2004 à 10:05
DarK Sidious
9 mai 2004 à 09:58
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.
9 mai 2004 à 09:53
DarK Sidious
9 mai 2004 à 09:40
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.
6 mai 2004 à 20:36
DarK Sidious
5 mai 2004 à 07:55
++
moustachu
4 mai 2004 à 19:11
4 mai 2004 à 17:24
Via API : 2000
Via calcul optimisé : 94
Soit 21x plus rapide.
4 mai 2004 à 09:27
Je ne pense pas que la mémoire y soit pour beaucoup, à moins de ne pas en avoir beaucoup !
DarK Sidious
4 mai 2004 à 09:22
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
4 mai 2004 à 09:10
DarK Sidious
4 mai 2004 à 08:57
1703/110 = 15x
4 mai 2004 à 08:53
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
4 mai 2004 à 08:34
++
moustachu
4 mai 2004 à 08:27
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
3 mai 2004 à 21:06
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
3 mai 2004 à 20:47
disons que cette classe permet d'utiliser GetDIBits facilement...
3 mai 2004 à 18:38
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
3 mai 2004 à 18:32
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
3 mai 2004 à 18:22
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
3 mai 2004 à 17:06
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
3 mai 2004 à 16:36
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
3 mai 2004 à 16:32
- 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
3 mai 2004 à 16:19
DarK Sidious
3 mai 2004 à 16:16
A+
Afyn
3 mai 2004 à 16:14
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
3 mai 2004 à 16:10
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
3 mai 2004 à 15:24
DarK Sidious