Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 2013
-
22 févr. 2010 à 10:56
pgl10
Messages postés380Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention29 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.
pgl10
Messages postés380Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention29 octobre 202311 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és380Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention29 octobre 202311 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és1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 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és380Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention29 octobre 202311 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és1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 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és380Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention29 octobre 202311 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és1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 22 févr. 2010 à 14:16
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 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;
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és380Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention29 octobre 202311 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és1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 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.
9 mars 2010 à 17:32
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.
2 mars 2010 à 13:22
1 mars 2010 à 09:16
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.
27 févr. 2010 à 13:16
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
24 févr. 2010 à 10:05
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+
23 févr. 2010 à 18:04
22 févr. 2010 à 14:16
http://www.brunews.com/brunews/index.htm
CP5 et JR5
A+
22 févr. 2010 à 14:14
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+
22 févr. 2010 à 11:16
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
22 févr. 2010 à 10:56
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+