Ceci est un projet WD17, qui peut fonctionner soit en mode 32-bit, soit en mode 64-bit.
(C'est la mise-à-jour d'un projet WD9 écrit en 2006.)
Il montre l'utilisation de 3 techniques différentes pour remplacer tous les pixels d'une certaine couleur par une autre.
1 - Avec les fonctions dPixelColor/dPoint du WLangage.
2 - Avec l'API bas niveau dans la procédure ReplaceColor.
3 - Avec la fonction ZI_ReplaceRGBColor de la bibliothèque graphique GDImage.
La configuration permet de tester le code soit en 32-bit, soit en 64-bit.
La version 64-bit est configurée par défaut.
Si vous voulez tester en mode 32-bit, vous devez remplacer la constante GDImage = "GDImage64" par GDImage = "GDImage".
Selon qu'on utilise l'API GetObjectA en mode 32-bit ou 64-bit, il est impératif d'ajuster l'alignement de la structure BITMAP car l'alignement est effectué sur 4-byte en 32-bit, et sur 8-byte en 64-bit.
Pour contourner ce problème j'utilise 2 structures différentes, BITMAP en 32, et BITMAP64 en 64 (membre supplémentaire dummy de 4-byte pour passer à une taille de 32 octets au lieu des 28 utilisés en 32-bit).
Ce qui se traduit dans la procédure ReplaceColor, par le code qui figure ci-dessous pour gérer les 2 configurations.
Le temps utilisé par chacune des 3 versions est mesuré avec précision grâce à l'utilisation des API QueryPerformanceFrequency et QueryPerformanceCounter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 IF In64bitMode() THEN GetObject(hBitmap, &bm64) bmW = bm64.bmWidth; bmH = bm64.bmHeight bmBPix = bm64.bmBitsPixel ELSE GetObject(hBitmap, &bm) bmW = bm.bmWidth; bmH = bm.bmHeight bmBPix = bm.bmBitsPixel END
Pour tester réellement la vitesse des 3 solutions proposées, amusez-vous a cliquer plusieurs fois sur chaque bouton pour voir la réactivité de l'affichage.
Capture d'écran
...
Partager