IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Rotation de Bitmap -> ScanLine


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Rotation de Bitmap -> ScanLine
    à tous

    Voilà j'ai récupérer ce code sur ******* mais je n'arrive pas à l'utiliser ...
    voilà si vous pouviez m'expliquer un peu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    41
    42
    function SetImgAngle(angle:integer; source:TBitmap):TBitmap;
    var
    n:integer;
    Largeur,ecart:integer;
    pi2:extended;
    z:extended;
    col_prov,lig_prov:integer;
    i,j:integer;
    couleur:DWord;
    xx,yy,x,y:integer;
    //Pour accelerer les chose: variable d'optimization
    cz,sz:extended;
    czpi,szpi:extended;
    begin
    n:=source.Width;
    Largeur:= source.Width div 2;
    result:=TBitmap.create;
    result.Height:=300;result.Width:=300;//a changer;
    ecart:= trunc((Sqrt(2*Sqr(n)) - n)/2);
    pi2:= pi / 2;
    z:= 0.01745 * angle;
    x:=source.Width div 2;y:=source.Height div 2;
    cz:=Cos(z);sz:=Sin(z);
    czpi:=Cos(z + pi2);
    szpi:=Sin(z + pi2);
    for i:= -ecart to n + ecart do begin
        col_prov:= trunc(Largeur + ((i - Largeur) * cz));
        lig_prov:= trunc(Largeur + ((i - Largeur) * sz));
        for j:= -ecart to n + ecart do begin
     
            xx:=trunc(col_prov + ((j - Largeur) * czpi));
            yy:=trunc(lig_prov + ((j - Largeur) * szpi));
            Couleur:=source.Canvas.Pixels [xx,yy];
     
            if (Couleur <> -1) and (Couleur <> $FFFFFF) then begin
                xx:=i + (X - Largeur);
                yy:=j + (Y - Largeur);
                result.Canvas.Pixels[xx,yy]:=Couleur
            end;
        end;
    end;
    end;
    pour le lancer:
    2 images + un scrollbar (par exemple):
    image2.picture.Bitmap:=SetImgAngle(scrollbar1.Position,image1.Picture.Bitmap)

    C'est pour le lancer que j'ai un problème l'histoire du scrollbar j'ai un peu de mal j'ai essayer comme ceci mais en vain ... j'ai un gros carré noir qui s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var
      img : TBitmap;
    begin
         img :=Tbitmap.Create;
         img.LoadFromFile('c:\fleche.bmp');
         form1.canvas.Draw(50,50,setImgAngle(30,img));
     
    end;
    d'avance

  2. #2
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut ..
    Heu ,

    Je suis pas trop sur d'avoir tout compris,mais je me lance

    La scrollbar n'est en faite qu'un moyen,pour modifier l'angle de rotation, l'auteur aurait du utiliser une TrackBar, c'est plus parlant ...

    Alors pour ta procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      img: TBitmap; 
    begin 
         img :=Tbitmap.Create; 
     
         img.LoadFromFile('c:\fleche.bmp'); 
     
        image1.picture.bitmap  := setImgAngle(20,img);
     
    end;
    essais comme cela pour voir si le code est fonctionel ...

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    image1.picture.bitmap := setImgAngle(20,img);
    euhhh je crois que c'est pas image1 mais img mais le plus génant c'est qu'il n'y a pas de clause picture sur les Tbitmap ... il y a bien une clause picture mais uniquement pour les TImage ...
    C'est bien mon problème car je dois utiliser un Tbitmap ...
    tout de même pour ton aide
    si vous avez des n'hésitez pas

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Points : 25
    Points
    25
    Par défaut
    J'écrirais l'appel de fonction plutôt ainsi, sinon tu perds la référence du pointeur TBitmap créé dans SetImgAngle, et tu provoques ainsi une fuite de tas (espace mémoire perdu). De même, dans Button1Click il faut libérer les TBitmap, sinon tu les perds dès la sortie de la procédure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      img   : TBitmap;
      img2 : TBitmap;
    begin 
         try
           img :=Tbitmap.Create; 
           img.LoadFromFile('c:\fleche.bmp'); 
           img2 := SetImgAngle( 30, img);
           form1.canvas.Draw(50,50, img2); 
         finally
           img.Free;
           img2.Free;
         end;
    end;

  5. #5
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut ...
    La procédure demande bien un
    function SetImgAngle(angle:integer; source:TBitmap):TBitmap;
    et en sors un tbitmap

    En faite place un Timage sur ta form , juste pour essayer le code,

    image1.picture.bitmap := setImgAngle(20,img);

    Tu vois si il y'a qqch qui s'affiche dans le Timage...

    Si il n'y a rien je pense que cela vient du code ...

    Sinon va voir ici , le code marche ->
    http://www.swissdelphicenter.ch/en/showcode.php?id=1540

    Voila ;-)

    Ps : Excusez moi pour les .free , je l'ai oublie toujours quand je mets des codes sur le forum

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 99
    Points : 126
    Points
    126
    Par défaut
    C'est bien le code qui ne marche pas... Ici un code beaucoup plus rapide (utilisation de scanline):

    http://homepages.borland.com/efg2lab/ImageProcessing/RotateScanline.htm

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    à tous pour votre aide
    Là je commence à lire la méthode scanline qui a priori devrait mieux fonctionner que celle-ci rbag

    @ bientôt

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    En faite place un Timage sur ta form , juste pour essayer le code,
    image1.picture.bitmap := setImgAngle(20,img);
    Tu vois si il y'a qqch qui s'affiche dans le Timage...
    Si il n'y a rien je pense que cela vient du code ...
    remixtech il n'y avait pas de problèmes de code de ce côté là mais voilà d'une part le rendu est long avec cette méthode et en plus cela fonctionne pas terrible alors :
    utlitiser ScanLine http://homepages.borland.com/efg2lab/ImageProcessing/RotateScanline.htm

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rotation de bitmap : problème de trigo avec PlgBlt
    Par Laskar dans le forum Langage
    Réponses: 5
    Dernier message: 26/11/2014, 14h29
  2. Dessiner avec rotation un bitmap
    Par Andry dans le forum Delphi
    Réponses: 6
    Dernier message: 04/05/2007, 15h15
  3. rotation de bitmap
    Par Manu1985 dans le forum Delphi
    Réponses: 2
    Dernier message: 08/12/2006, 13h36
  4. Lecture d'une image bitmap
    Par Geronimo dans le forum x86 32-bits / 64-bits
    Réponses: 18
    Dernier message: 28/06/2002, 12h01
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo