GET ET SETDIBITS

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 26 juil. 2006 à 14:40
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 - 2 août 2006 à 22:36
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/38788-get-et-setdibits

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
2 août 2006 à 22:36
En tout cas je te conseil d'eviter les optimisations de ce genre, à savoir itérer à rebourd et faire x*2 + x au lieu de x*3, car au mieux le gain est presque invisible, au pir tu empeches le compilateur de faire de vrais optimisations et dans tout les cas ca rend le code moins lisible.
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 août 2006 à 22:13
Mais ce n'est qu'un simple exemple. Bien sûr que j'aurais pu modifier tel et tel pixel sans avoir recour à une boucle (ou une mais petite). Ce que je voulais faire, c'est une simple manipulation dans le buffer (ici changer les couleurs de chaque pixels) tout en montrant le calcule pour trouver une position x et y dans le buffer. Non ce n'est pas ce qu'il y a de plus optimisé mais je voulais montrer cette fonctionnalité le plus simplement possible.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 août 2006 à 21:49
Oui, mais ce n'est pas une raison pour le faire dans un boucle.
Je suis pss du tout ton raisonnement:
-d'une part tu converge vers 0 parce que c'est soit-disant plus rapide (une instruction en moins)
-d'autre part tu ralentis considérablement la boucle en faisant à chaque tour un calcul inutile
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 août 2006 à 21:31
D'après ce que j'en sais, une lecture séquencielle signifie lire les valeurs dans l'ordre une à la suite de l'autre. C'est évident que cette méthode va beaucoup plus vite que de calculer à chaque tour de boucle la position x et y mais il devien impossible d'optenir une position bien précise en un calcule. Il est toujours intéressent de savoir comment aller à la position x et y de son image à partir du buffer. Ça permet de modifier bien spécifiquement son image.
cs_Omeya Messages postés 28 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 10 août 2006
2 août 2006 à 18:45
Je crois avoir trouvé... Je ne sais pas si c'est ça, mais "séquentiellement" signifie incrémenter ou décrémenter un pointeur sur le tableau LPBYTE. Dites-moi si j'ai faux.
En tout cas, j'ai testé la méthode séquentielle et ça marche.
cs_Omeya Messages postés 28 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 10 août 2006
2 août 2006 à 16:13
steve_clamage : "Tu enlèves une comparaison mais ton calcul de pos est plus complexe, surtout que comme l'a dit vecchio56 ca peut se parcourir en une seule boucle."

J'ai du mal à comprendre quand vous dites qu'il suffit de passer toute la zone mémoire séquentiellement.
Quel est le code en une seule boucle, svp?
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
29 juil. 2006 à 23:25
"Ah et pour le x+x*2 à la place de x*3 c'est que x*3 va générer un imul très coûteux en temps processeur. x+x*2 va générer un lea, beaucoup moin long à executer et tout aussi efficasse."

Le compilateur n'est pas con, si nous on peut le faire alors lui... . J'ai testé avec gcc (en -O3) et il me génère exactement la meme sortie pour x*3 et x*2 +x, avec le leal. Le but d'un compilateur c'est de ne plus avoir à penser en logique assembleur, sinon autant écrire directement en assembleur pour avoir un vrai controle sur le code. Il ne faut pas non plus oublier que le compilateur sais optimiser un code dans la mesure du possible, tant qu'il possède assez d'information pour etre sur de ne pas casser la sémantique du code.
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
29 juil. 2006 à 23:21
Je crois que tu as raison. J'ai fait des listings et à première vue, le calcule bouffe beaucoup de temps processeur.
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
29 juil. 2006 à 23:12
Tu enlèves une comparaison mais ton calcul de pos est plus complexe, surtout que comme l'a dit vecchio56 ca peut se parcourir en une seule boucle.

Tu devrais faire des tests car tu gagnes presque rien (un cmp contre un jns), ca peut meme empecher le compilateur de faire de vrai optimisations (comme une vectorisation). En générale on optimise ce qui prend du temps, pas le code d'une boucle !
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
29 juil. 2006 à 23:11
Ah et pour le x+x*2 à la place de x*3 c'est que x*3 va générer un imul très coûteux en temps processeur. x+x*2 va générer un lea, beaucoup moin long à executer et tout aussi efficasse.

P.S. Merci à BruNews, c'est lui qui m'a apprit tout ça :)
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
29 juil. 2006 à 23:01
Soustraire vers 0 est toujours plus rapide que d'additionner de 0:
for (y = 0; y < bi.bmiHeader.biHeight; y++)
xor ebx, ebx ;;; y = 0
lblFOR:
;;; divers codes
inc ebx
cmp ebx, bi.bmiHeader.biHeight <- ICI cette comparaison prend du temps processeur et peut être évité
jb lblFOR

for (y = bi.bmiHeader.biHeight - 1; y >= 0; y--)
mov ebx, bi.bmiHeader.biHeight - 1
lblFOR:
;;; divers codes
dec ebx
jns lblFOR

Normalement oui vecchio mais comme pour mon autre source, ceci a aussi pour but de montrer comment calculer la position x et y dans le buffer.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 juil. 2006 à 22:59
Normalement on ne devrait pas avoir a calculer de position a chaque tour de boucle. Il suffit de passer toute la zone mémoire séquentiellement
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
29 juil. 2006 à 22:46
Pourquoi ne pas parcourir l'image comme ca tout simplement ?

for(y = 0; y < bi.bmiHeader.biHeight; y++)
{
for(x = 0; x < bi.bmiHeader.biWidth; x++)
{
// Calcule de la position dans le buffer
const int pos = (y * bi.bmiHeader.biWidth) + x*3;

lpBits[pos]++; // Bleu
lpBits[pos+1]++; // Vert
lpBits[pos+2]++; // Rouge
}
}
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
29 juil. 2006 à 22:20
Peux tu expliquer ce que tu veux dire s'il te plait?
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
29 juil. 2006 à 22:16
Pourquoi parcourir l'image de cette façon ? C'est peut lisible et au final c'est moins efficace ??
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
27 juil. 2006 à 05:48
Salut,
merci pour la source. :)

Ca fonctionne chez moi (nouvelle version de l'exe qui fonctioone chez tout le monde à prioris, pas testé la précédente).

Sinon pour l'ortho de "bizzard", je pense tout simplement que c'est le syndrome de la génération blizzard. :D

A+


eRoZion
gamemonde Messages postés 336 Date d'inscription samedi 9 août 2003 Statut Membre Dernière intervention 9 juillet 2011 2
27 juil. 2006 à 02:04
oui maintenant ca marche tres bonne source ca va en aider beaucoup moi-de-meme qui defois me pert dans cette fonction
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
26 juil. 2006 à 18:25
Oui je pense que c'est bon
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juil. 2006 à 18:19
Ok c'est fait. L'exe est-il fonctionnel à présent?
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juil. 2006 à 18:07
Bingo. J'ai tout compris. En fait, étant donné que je récupère les données du DC mémoire, ce DC mémoire prend le nombre de couleurs de l'écran. Donc bmp.bmBitsPixel renvoie le nombre de couleur présent dans le DC mémoire qui est égual au nombre de couleur de votre système. Vue que je suis en 16 bits ici, moi ça fonctionnait mais il modifiait uniquement le bleu et le vert. Bon je modifie le code et je fais quelque test de sécurité et je vous renvoie ça.

Merci vecchio, c'est grâce à toi que j'ai allumé.
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juil. 2006 à 17:55
Ok je comprend. C'est le calcule de la taille du buffer le problème. D'accord. Je modifie le code pour le forcer à prendre du 24 bits.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
26 juil. 2006 à 17:39
Ca marche si on force bmp.bmBitsPixel à 24 juste après GetObject(hBmp, sizeof(bmp), &bmp);
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
26 juil. 2006 à 17:28
L'appel de GetDIBits retourne 0 chez moi
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
26 juil. 2006 à 17:26
Ah oui j'avais pas vu, merci!
Ben non logiquement ca peut pas venir de ca. Je vais voir si je trouve d'ou ca vient
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juil. 2006 à 17:22
Ête vous capable de voir ce qui ne fonctionne pas dans le code? Moi j'ai bo chercher, je ne suis pas famillié avec les dialog

P.S. J'ai utiliser ton éditeur vecchio. Ce pourrait-il que ce soit le dialog le problème?
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juil. 2006 à 17:11
Je vien de tester sur mon autre ordinateur et en effet, ça ne fonctionne pas non plus. C'est trop bizzard. Pourquoi tout fonctionne sur mon ordi mais pas sur les votres
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
26 juil. 2006 à 16:48
Salut,
Je viens de tester l'exe et pas de modification de l'image chez moi non plus.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
26 juil. 2006 à 16:45
J'ouvre mspaint, je gribouille un peu
J'enregistre l'image au format bmp 24 bits
Je lance ton programme
J'ouvre l'image que je viens d'enregistrer
J'appuie sur Modifier comme un forcené, mais rien ne se passe (on voit bien l'image mais elle ne change pas)
Désolé mais ce n'est pas une blague
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juil. 2006 à 16:33
C'est pas une blague que t'es entrait de me faire là ;)?
Sinon, décrit moi ce que tu fait. Il ne se passe vraiment rien quand tu clique sur modifier?
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juil. 2006 à 16:25
Ben là. Excuse pour les fautes. Je vien d'apprendre qu'un membre de ma famille est mort alors ça me débousole un peu. Sinon, je ne comprend vraiment pas. Tout fonctionne ici. Même si je télécharge l'exe, il fonctionne qu'en même.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
26 juil. 2006 à 16:19
C'est fou le nombre de gens qui ne savent pas écrire bizarre :)
Ben non j'ai pas recompilé, c'est quand même censé marcher directement avec l'exécutable
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juil. 2006 à 16:14
C'est bizzard. Moi tout les bmp que j'ai tester ce modifiais quand je cliquais sur modifier. A tu essayé en recompilant le code?
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
26 juil. 2006 à 16:10
Oui dans le code je l'ai vu, mais quand je teste l'exécutable, l'image n'est pas modifiée
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juil. 2006 à 15:33
for(y = bi.bmiHeader.biHeight-1; y >= 0; y--)
{
for(x = bi.bmiHeader.biWidth-1; x >= 0; x--)
{
// Calcule de la position dans le buffer
int pos = (bi.bmiHeader.biHeight-y-1)*ByteWidth+x+x*2;

lpBits[pos]++; // Bleu
lpBits[pos+1]++; // Vert
lpBits[pos+2]++; // Rouge
}
}

Changement de la couleur de chaque pixel à partir du buffer.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
26 juil. 2006 à 14:40
T'es sur de ton coup? Je vois pas de mofication de l'image
Rejoignez-nous