MONPPM : UN AFFICHEUR .PPM

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 - 22 févr. 2010 à 10:56
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 - 9 mars 2010 à 17:32
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/51334-monppm-un-afficheur-ppm

pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
9 mars 2010 à 17:32
La v 0.7 corrige quelques cas paticuliers dont les fenêtres maximisées. Et on a
amélioré le source. Merci à Pistol_Pete pour ses conseils et ses encouragements.
NOTA : http://www.hlevkin.com/TestImages/moon.ppm a 11 Mo et 1986 x 1986 pixels.
Et la photo de Lena Söderberg (née Sjööblom) est parue dans Playboy en nov 1972.
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
2 mars 2010 à 13:22
Avec la version 0.6 quand l'utilisateur redimensionne la fenêtre avec la souris le scintillement n'apparaît plus. pgl10
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
1 mars 2010 à 09:16
Salut
Bravo pour toutes les modifications apportées! Je n'ai pas eu un seul échec lors de l'ouverture de mes fichiers ppm!
Ce programme est simple rapide et fonctionnelle!
Dernier petite chose et c'est un détail: regarde le message WM_ERASEBKGND: il te permettra d'éviter le scintillement de la fenêtre quand tu la redimensionnes.
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
27 févr. 2010 à 13:16
Dans la version 0.4 on a implémenté le StretchBlt grâce au soutien de Pistol_Pete.
Merci à lui. Et cela va encore beaucoup plus vite ! Il existe une assez grande
variété de fichiers *.ppm et pour cela on a reprogrammé la lecture du fichier image.
On a mis un zoom à 3 niveaux et on peut redimensionner de la fenêtre. pgl10
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
24 févr. 2010 à 10:05
Quelle réactivité ! Merci

Effectivement c'est déjà beaucoup beaucoup mieux.
Quelques piste d'amélioration tout de même:
-Créer des raccourcis clavier au lieu de traiter le msg WM_KEYDOWN et GetAsyncKeyState(VK_CONTROL))

-Ne pas créer une image vide lorsque l'action d'ouverture est annulée. (Laissé le prog redessiner le fond de la fenêtre par dessus)

-Gérer le BitBlt ou leStretchBlt
A+
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
23 févr. 2010 à 18:04
Voici donc la version 0.3 de MonPPM. Ceci implémente, je crois, tous les conseils très judicieux de Pistol_Pete. Il en résulte une présentation du source et des performances bien meilleures et une charge CPU beaucoup plus faible. Mon objectif d'afficher efficacement les images calculées que j'obtiens par ailleurs est complètement atteint. Merci beaucoup à Pistol_Pete pour son aide. pgl10
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
22 févr. 2010 à 14:16
Pour la programmation Windows, deux livres incontournables : Richter et Petzold
http://www.brunews.com/brunews/index.htm

CP5 et JR5

A+
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
22 févr. 2010 à 14:14
Je viens de regarder l'ensemble du code et il y a quelques erreurs de conceptions:

1)Pour le message WM_SIZING: (ici je bloque la taille de la fenêtre à 290 par 530px)
case WM_SIZING :
RECT *prc;
prc= (RECT*) lParam;
if(prc->right-prc->left!=290)
if(wParam==WMSZ_BOTTOMRIGHT || wParam==WMSZ_RIGHT|| wParam==WMSZ_TOPRIGHT)
prc->right=prc->left+290;
else
prc->left=prc->right-290;

if(prc->bottom-prc->top!=530)
if(wParam==WMSZ_BOTTOMRIGHT || wParam==WMSZ_BOTTOM || wParam==WMSZ_BOTTOMLEFT)
prc->bottom=prc->top+530;
else
prc->top=prc->bottom-530;
break;

2) Gros soucis avec le WM_PAINT:
Quand un message WM_PAINT est appelé, on n'a pas le droit de le breaker en cours de route comme tu le fais quand il n'y a pas d'image à charger. Si tu le break, la fenêtre ne peut pas valider son rafraichissement et un nouveau message WM_PAINT sera tout de suite envoyé. Il faut faire quelque chose de la sorte :
# PAINTSTRUCT ps;
# hDC = BeginPaint( hWind , &ps );
# if(paint != 0)
# paintModel();
# EndPaint( hWind , &ps );

3) Ta pompe à message n'est pas optimisé :
PeekMessage() n'attend pas qu'il y ai un message dans la file d'attente, donc il ne laisse pas la possibilité à d'autre prog de tourner. Regarde dans le gestionnaire des tache, ton processus doit prendre 100% de l'UC même quand tu ne fais rien...

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

4) L'erreur la plus importante : A chaque fois que tu reçois un WM_PAINT, tu recharges l'image! Il faut savoir qu'il y a beaucoup de WM_PAINT qui son envoyé à la fenêtre...
Il faut que tu charges (une unique fois) l'image dans un buffer et que tu l'affiches via un BltBit().
Regarde cette source qui propose une classe CImage minimale pour charger et afficher une image en win32
http://www.cppfrance.com/codes/TRAITEMENT-IMAGE-FILTRE-MEDIAN-TEMPS-CONSTANT_49471.aspx
A+
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
22 févr. 2010 à 11:16
Merci Pistol_Pete. Je vais suivre tes conseils.
Et j'imagine que d'autres remarques seraient utiles,même
si mon intention est de conserver un logiciel très simple.
A plus tard pour une future nouvelle version. pgl10
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
22 févr. 2010 à 10:56
Salut
J'ai quelques remarques:

- Tu fais, grosso modo, Largeur * Hauteur fread + le même nombre de fseek, donc tu as Largeur * Hauteur accès disques !
Il faudrait mieux que tu lises ton fichier en une unique fois puis que tu travailles ensuite sur ton buffer, tu gagnerais grandement en performance.
- J'aurai aimer voir une fonction que ce charge uniquement de l'ouverture de l'image ici tu fait en plus :
# SetWindowPos(hWnd,0,0,0,larg/zoom,74+haut/zoom,SWP_NOZORDER|SWP_NOMOVE);
# guidage();
# paint=2; // le premier affichage du fichier image est terminé

- Les fonctions SetPixelxxx; sont très lente puisqu'elles font autant d'appel qu'il y a de pixel dans l'image.
Il faudrait que le prototype de ta fonction soit :
ReadPPM(char *szFileName, UCHAR *ucpBits,int *iWidth,int *iHeight)
avec szFileName le nom de ton fichier,
ucpBits un pointeur que tu alloueras quand tu connaitras le nombre de pixels dans ton image et W, H le nombre de pixel de ton image.

Voila, j'espère que ses quelques remarques te permettront d'avancer.
Regarde ici (http://ImAnalyse.free.fr) si tu veux un code fonctionnel en traitement de l'image.

A+
Rejoignez-nous