Clignotement de TBITMAP

Signaler
Messages postés
25
Date d'inscription
jeudi 9 septembre 2004
Statut
Membre
Dernière intervention
31 octobre 2012
-
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
-
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

Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
35
Salut :

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