Optimisation de la fonction sleep dans un traitement d'image
Bonjour les champions ! :yaisse2:
J'ai fait un soft de diaporama pour une vitrine d'agence immobilière. Il m'ont demandé de rajouter des transitions entre images j'ai donc pondu le code suivant qui charge une photo par dessus l'ancienne avec une transition caré. C'est a dire que je part du centre, je colorie a la verticale le cotes gauche du centre, puis a l'horizontale au dessus du centre, puis a la verticale le cotes droit du centre, puis a l'horizontale sous le centre. Une fois le tour fini je refresh l'image et j'agrandis mon carré a la rangé de pixel suivante. Mon souci pour qu'on voye la transition j'utilise un sleep dans ma boucle. Mais cette fonction est bloquante pour le programme, ce qui ralentie toute les autres fenêtre. Comment rendre tout cela plus fluide, n'ai je d'autre solution que de pondre un thread ? ( mais je ne suis pas très a l'aise avec ça )
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| void TDiaporama::transition (AnsiString ndf)
{
int tr , cx, cy, x,y ;
//determine le centre de l'image
// plus efficasse si width et height sont impair
cx = LaPhoto->Width / 2 + 1 ;
cy = LaPhoto->Height / 2 + 1;
TJPEGImage *LImageJPEG ;
LImageJPEG = new TJPEGImage ;
LImageJPEG->LoadFromFile(ndf) ;
Graphics::TBitmap *source = new Graphics::TBitmap();
source->Width = LaPhoto->Width ;
source->Height = LaPhoto->Height ;
source->Canvas->StretchDraw(source->Canvas->ClipRect,LImageJPEG) ;
LaPhoto->Canvas->Pixels[cx][cy] = source->Canvas->Pixels[cx][cy] ;
for( tr = 1 ; tr < cx ; tr ++)
{
Sleep(5) ;
x = cx -tr ; //fixe x gauche du cente
for( y = cy + tr - 1 ; y >= cy - tr ; y --)
//colorie le cotes gauche
LaPhoto->Canvas->Pixels[x][y] = source->Canvas->Pixels[x][y] ;
y = cy - tr ;//fixe y au dessus du centre
for( x = cx -tr + 1 ; x <= cx + tr ; x++)
//colorie le haut
LaPhoto->Canvas->Pixels[x][y] = source->Canvas->Pixels[x][y] ;
x = cx + tr ;//fixe x apres le centre
for( y = cy - tr + 1 ; y <= cy + tr ; y ++ )
//colorie le cotes droit
LaPhoto->Canvas->Pixels[x][y] = source->Canvas->Pixels[x][y] ;
y = cy + tr ;//fixe y sous le centre
for( x = cx + tr - 1 ; x >= cx - tr ; x-- )
//colorie le bas
LaPhoto->Canvas->Pixels[x][y] = source->Canvas->Pixels[x][y] ;
//affiche l'image
LaPhoto->Refresh() ;
}
delete LImageJPEG ;
delete source ;
} |
Merci d'avance !! ;)