Clignotement de TBITMAP

websinh Messages postés 25 Date d'inscription jeudi 9 septembre 2004 Statut Membre Dernière intervention 31 octobre 2012 - 4 sept. 2006 à 09:57
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 4 sept. 2006 à 23:09
Bonjour à tous,

Je suis un peu embêter avec une animation. En fait j'essaie de faire tourner un composants sur lui même en lui changeant son angle. Malheureusement, étant donné que j'utilise du TBitmap et que l'image est assez grande, il y a un clignotement qui est généré au ritme du timer.

Voici comment il fonctionne en gros :

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void __fastcall clRoll::Paint()
{
  Graphics::TBitmap *SrcBitmap=new Graphics::TBitmap;
  Graphics::TBitmap *DestBitmap=new Graphics::TBitmap;
  AnsiString BmpPath;


  if(FAlarm)
        BmpPath = "C:\\Planar\\Bitmaps\\RollAlarm.bmp";
  else if (FTurn)
  {
        if (FSens==sensLeft)
                BmpPath = "C:\\Planar\\Bitmaps\\RollLeft.bmp";
        else
                BmpPath = "C:\\Planar\\Bitmaps\\RollRight.bmp";
  }
  else
        BmpPath = "C:\\Planar\\Bitmaps\\Roll.bmp";


  SrcBitmap->LoadFromFile(BmpPath);


  //To adapt the center of the rotating animation
  float centreX = 0;
  float centreY = 0;


  //Convert degrees to radians
  float radians=(2*3.1416*FAngle)/360;


  float cosine=(float)cos(radians);
  float sine=(float)sin(radians);


  float Point1x=(-SrcBitmap->Height*sine);
  float Point1y=(SrcBitmap->Height*cosine);
  float Point2x=(SrcBitmap->Width*cosine-SrcBitmap->Height*sine);
  float Point2y=(SrcBitmap->Height*cosine+SrcBitmap->Width*sine);
  float Point3x=(SrcBitmap->Width*cosine);
  float Point3y=(SrcBitmap->Width*sine);


  float minx=min(0,min(Point1x,min(Point2x,Point3x)));
  float miny=min(0,min(Point1y,min(Point2y,Point3y)));
  float maxx=max(Point1x,max(Point2x,Point3x));
  float maxy=max(Point1y,max(Point2y,Point3y));


  int DestBitmapWidth=(int)ceil(fabs(maxx)-minx);
  int DestBitmapHeight=(int)ceil(fabs(maxy)-miny);


  DestBitmap->Height=DestBitmapHeight;
  DestBitmap->Width=DestBitmapWidth;


   for(int x=0;x<DestBitmapWidth;x++)
   {
        for(int y=0;y<DestBitmapHeight;y++)
        {
                int SrcBitmapx=(int)((x+minx)*cosine+(y+miny)*sine);
                int SrcBitmapy=(int)((y+miny)*cosine-(x+minx)*sine);
                if(SrcBitmapx>=0&&SrcBitmapx<SrcBitmap->Width&&SrcBitmapy>=0&&
                SrcBitmapy<SrcBitmap->Height)
                {
                        DestBitmap->Canvas->Pixels[x][y]=
                        SrcBitmap->Canvas->Pixels[SrcBitmapx][SrcBitmapy];
                }
                else
                        DestBitmap->Canvas->Pixels[x][y]=clWhite;
        }
  }


  centreX = abs(DestBitmap->Width)/2-abs(SrcBitmap->Width)/2;
  centreX = 21-abs(centreX);
  centreY = abs(DestBitmap->Height)/2-abs(SrcBitmap->Height)/2;
  centreY = 21-abs(centreY);


    //Show the rotated bitmap
  DestBitmap->Transparent = FTransparent;
  DestBitmap->TransparentMode = tmAuto;
  Canvas->Draw(centreX,centreY,DestBitmap);


  Width = DestBitmap->Width+centreX;
  Height = DestBitmap->Height+centreY;


  delete SrcBitmap;
  delete DestBitmap;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Quu'est ce que vous me conseillez ? Est-ce que je devrais passer par une autre méthode graphique ?

Merci à vous tous

PS. J'utilise Borland C++Builder 6

1 réponse

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
4 sept. 2006 à 23:09
Salut :

Je pense que l'API FreeImage propose des fonctions pour faire la rotation d'une image.
FreeImage : bibliothèque de traitement des images.
0
Rejoignez-nous