VIEWER COMPLET POUR LE TRAITEMENT DE L'IMAGE : IMANALYSE

opossum_farceur Messages postés 147 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 14 novembre 2009 - 24 janv. 2010 à 00:40
b2kguga Messages postés 5 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 10 décembre 2015 - 8 sept. 2013 à 21:27
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/51146-viewer-complet-pour-le-traitement-de-l-image-imanalyse

b2kguga Messages postés 5 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 10 décembre 2015
Modifié par b2kguga le 8/09/2013 à 21:40
Thank you for your project. Is Version 4 ready ?
One question on the source of cimage. The "copy" function is labeled twice, whereas one is for copy and other is for paste. On cimage.cpp this:

void CImage::Copy(HBITMAP hBmp)
{
if(hBmp==0)
return;

BITMAP Bmp;

//DesAllocation
Clean();

//Recupération des caractéristiques de l'images
GetObject(hBmp,sizeof(Bmp),&Bmp);

m_iWidth=Bmp.bmWidth;
m_iHeight=Bmp.bmHeight;

//Allocation
m_ucpBits = (UCHAR*)ALLOCMEM((m_iWidth*m_iHeight)*4);

//Création du bitmap
m_hBmp=CreateBitmap(m_iWidth,m_iHeight,1,32,m_ucpBits) ;

//On copie les données

//recupération des pixels
GetBitmapBits(hBmp,(m_iWidth*m_iHeight)*4,m_ucpBits);
SetBitmapBits(m_hBmp,(m_iWidth*m_iHeight)*4,m_ucpBits);
}


Should be named as:

void CImage::Paste(HBITMAP hBmp)
{
if(hBmp==0)
return;

BITMAP Bmp;

//DesAllocation
Clean();

//Recupération des caractéristiques de l'images
GetObject(hBmp,sizeof(Bmp),&Bmp);

m_iWidth=Bmp.bmWidth;
m_iHeight=Bmp.bmHeight;

//Allocation
m_ucpBits = (UCHAR*)ALLOCMEM((m_iWidth*m_iHeight)*4);

//Création du bitmap
m_hBmp=CreateBitmap(m_iWidth,m_iHeight,1,32,m_ucpBits) ;

//On copie les données

//recupération des pixels
GetBitmapBits(hBmp,(m_iWidth*m_iHeight)*4,m_ucpBits);
SetBitmapBits(m_hBmp,(m_iWidth*m_iHeight)*4,m_ucpBits);
}


Also, can it be avoided to use classes ? I really like your code. It is simple, and easy to mantain because 90% of it is pure win api. But, can you use only win apis, instead using classes ?

I am converting teh source to assembly language and dispites the fact that classes are mainly structures, they are a bit hard to maintain.

Can you make the image processing functions as dlls, instead making them attached to the main gui ? If i suceed translating it, i plan to make plugins for it for making easier to others build their own functions for it without "touching" inside the main app.

Also there are a few bugs on the workspace. When you zoom the image to the maximum (60 x), the RGB values that shows on each block is not precise. I mean, when you hover the mouse over a block it will display a value on the statusbar and other inside the "block" (pixel). The values on the blocks seems to be placed wrong one or 2 pixels to the right or below where the label should be


Also, on the WorkSpaceProc function (the WM_CHANGE_PICTURE case) it have some code that are never used. Why did you kept them there ?

Here:
case WM_CHANGE_PICTURE:
SetFocus(hwnd);
if(wParam==100)SendMessage(hwndWorkSpace,WM_ZOOMFIT,0,0);
if(lParam >=0 && lParam<NB_BUFFER)
CurrentImg=(int)lParam;
SendMessage(hwndImageSmall,WM_UPDATE,0,0);
SendMessage(hwndToolBar,WM_UPDATE,0,0);
Img[CurrentImg].CreateMiniature(90,90);
InvalidateRect(hwndMain,0,1);
SendMessage(hwndEdition,WM_CHANGE_PICTURE,0,0);
if(KeepZoomAndPos==0){
SendMessage(hwnd,WM_ZOOMFIT,0,0);
InvalidateRect(hwndImageSmall,0,1);
//****************InvalidateRect(hwndImage,0,1);
SendMessage(hwndStatutBar,WM_CHANGE_PICTURE,0,0);

break;
}
else{

W=Img[CurrentImg].GetWidth();
H=Img[CurrentImg].GetHeight();
sizeImageX=(int)(W*Zoom);
sizeImageY=(int)(H*Zoom);
InvalidateRect(hwnd,0,0);
//*****MoveWindow(hwndImage,X,Y,(int)(W*Zoom),(int)(H*Zoom),1);
InvalidateRect(hwndImageSmall,0,1);
//*****InvalidateRect(hwndImage,0,1);
SendMessage(hwndStatutBar,WM_CHANGE_PICTURE,0,0);

break;
}

// ---------- ALL OF THIS CODE BELOW IS NEVER USED

if(X<0)X=0;
if(Y<0)Y=0;
if(X>cx || Y>cy){
X=cx-10;Y=cy-10;
}
W=Img[CurrentImg].GetWidth();
H=Img[CurrentImg].GetHeight();
sizeImageX=(int)(W*Zoom);
sizeImageY=(int)(H*Zoom);
InvalidateRect(hwnd,0,0);
//*****MoveWindow(hwndImage,X,Y,(int)(W*Zoom),(int)(H*Zoom),1);
InvalidateRect(hwndImageSmall,0,1);

break;
opossum_farceur Messages postés 147 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 14 novembre 2009
26 janv. 2010 à 03:56
Hi!
Bon, pour l'histoire du chevauchement, j'ai l'explication : c'est à cause de la taille des caractères de WinXP (paramètres\affichage\avancé), positionnée sur "grande taille" (120ppp), ce qui fait que tes labels prennent plus de place et repoussent les zones d'édition qui à leur tour empiètent sur l'image, dont le positionnement devait être à mon avis "absolu" (à moins que ce soit à cause des dimensions de la boîte de dialogue qui s'avère du coup trop petite?). Pour éviter ces désagréments, tout mettre dans des "layout", des "grid" ou des "group", sans jamais préciser de coordonnées "en dur", mais bon, tu dois certainement savoir tout çà...
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
25 janv. 2010 à 18:11
Bonjour
Merci beaucoup pour vos retours et vos mots d'encouragement! Cela fait très plaisir.

>Opossum_farceur : Pour les problèmes de chevauchement sur les boites de dialogue, je n'ai pas réussi à reproduire le problème. Je suis aussi sous XP et j'ai essayé toutes les résolutions possibles... Pas de soucis aussi avec mon Vista. Je ne sais pas d'où cela peut venir...

Pour ta proposition (très intéressante soit dit en passant), j'y avais pensé il y a déjà quelques temps et j'avais fait une tentative inachevé... Je voulais faire l'équivalent des macros: Pouvoir enregistrer le traitement de l'utilisateur et ensuite l'appliquer sur tout une série d'image. Les macros étant un fichier txt banal avec des appels fonctions de mon programme. Cependant, je me suis rendu compte que c'est un travail qui prend BEAUCOUP de temps... et j'ai perdu la motivation en cours de route.
Ceci dit, peut être un jour...
underprog Messages postés 19 Date d'inscription samedi 7 novembre 2009 Statut Membre Dernière intervention 16 mai 2010
25 janv. 2010 à 11:19
Excellent boulot! Projet interessant et avancé, interface claire & soignée... Je pense que tu mérites amplement la note maximale! ;)
opossum_farceur Messages postés 147 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 14 novembre 2009
24 janv. 2010 à 00:40
Impressionnant!
Je me garderai bien de critiquer ton code, il est trop volumineux pour çà, les algorithmes que tu utilises me sont pour la plupart totalement inconnus, et je n'utilise pas les outils de développement Microsoft.
Aussi je me contenterai de faire quelques remarques sur la forme.
L'image d'adresse :
http://michel.vanthodiep.free.fr/misc/img1.png
montre un chevauchement qui apparaît dans plusieurs boîtes de dialogue; on y voit aussi que certaines légendes sont à moitié escamotées (je suis sous WinXP, résolution 1024x768).
Quelques fautes en passant :
"augmentation" et non pas "augmantation" dans le menu "Morphologie"
dans "Traitement\FloodFill", "couleur de fond" et non pas "couleur de font", etc...
Un aspect fort intéressant d'ImAnalyse (et à mon avis à développer) est son système de scripts, qui permet de faire toute une batterie de tests et d'en comparer les résultats : sous chaque image, cependant, il serait judicieux de préciser le nom du test; d'autre part, les "scripts" sont codés en C++ et sont donc incorporés à l'exécutable, ce qui fait qu'une modif ou un ajout requiert une recompilation! Il devrait être possible (du point de vue de l'utilisateur!) de rédiger un script dans un banal fichier texte, en respectant une syntaxe qui n'a pas à être très élaborée.
En espérant ces quelques remarques constructives...
Rejoignez-nous