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

C++Builder Discussion :

Transformation d'images avec Scanline [Trucs & Astuces]


Sujet :

C++Builder

  1. #1
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut Transformation d'images avec Scanline
    Salut,

    Voici le code qui me pose quelques soucis :
    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
     
    Graphics::TBitmap* bmp=new Graphics::TBitmap();
     bmp->Height=113;
     bmp->Width=249;
     
     Graphics::TBitmap* Original=new Graphics::TBitmap();
     Original->Height=113;
     Original->Width=249;
     Original->LoadFromFile(OpenPictureDialog1->FileName);
     
     for(int y=0;y<113;y++)
     {
      LigneRotated=(RGBTRIPLE*)bmp->ScanLine[y];
      for(int x=0;x<249;x++)
      {
       LigneOriginal=(RGBTRIPLE*)Original->ScanLine[x];
       LigneRotated[x].rgbtRed=LigneOriginal[y].rgbtRed;
       LigneRotated[x].rgbtBlue=LigneOriginal[y].rgbtBlue;
       LigneRotated[x].rgbtGreen=LigneOriginal[y].rgbtGreen;
      }
     }
     Image2->Picture->Bitmap=bmp;
    JE me rends compte au final que Image2 est blanc, vide de l'image retournée à parir de Original.
    Pq??

  2. #2
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Le mieux serait de nous dire ce que vous voulez faire. En principe, on ne manipule pas des nombre "en dur" dans le code, si vous chargez une image dans un bitmap, faites simplement LoadFromFile apres le new, le bitmap adéquat sera créé avec les dimensions de l'image lue. À ce stade, vous créez un autre bitmap sur la base des dimensions du premier, ce qui fait que vous ne manipulez aucun nombre et l'algorithme marchera quelle que soit l'image. Mais vous ne dites pas ce que vous voulez faire, probablement une simple rotation mais ce n'est pas très clair.

    À bientôt
    Gilles

  3. #3
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut
    En effet, j'aurais pu préciser!! désolé.

    Je souhaite retourner une image d'un angle de 90° et lui appliquer une symétrie axiale par rapport à l'horizontale. Ainsi une image simple de taille height=2 et width=3, de coordonnées pixels:

    1,1 2,1 3,1
    2,1 2,2 3,1


    deviendrait une image de taille height = 3 et width = 2

    1,1 2,1
    2,1 2,2
    3,1 3,1

    Je souhaitais optimiser le code en utilisant ScanLine.

  4. #4
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Je crains qu'il ne faille le programmer à la main, je n'ai pas trouvé de méthode de rotations dans la doc C++ Builder mais peut-être que cela existe sous un autre nom. Je crains également qu'il ne sera pas très aisé d'utiliser ScanLine, très pratique certes pour scanner à grande vitesse, mais probablement peu adéquat ici à cause de la modification des dimensions du bitmap résultat. IL faut probablement faire du pixel à pixel, ce qui ne manquera pas d'être très lent. J'espère que quelqu'un trouvera mieux en réponse à ce problème.

    À bientôt
    Gilles

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 393
    Points : 1 785
    Points
    1 785
    Par défaut
    Salut !

    Source et Destination sont deux Graphics::TBitmap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int w = Source->Width - 1;
    int h = Source->Height - 1;
    Pour une rotation de 90° à droite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Destination->Width = Source->Height;
    Destination->Height = Source->Width;
    for(int y = 0; y < Source->Height; y++)
        {
        for(int x = 0; x < Source->Width; x++)
            {
            Destination->Canvas->Pixels[h - y][x] = Source->Canvas->Pixels[x][y];
            }
        }
    Pour une rotation de 180°
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Destination->Width = Source->Width;
    Destination->Height = Source->Height;
    for(int y = 0; y < Source->Height; y++)
        {
        for(int x = 0; x < Source->Width; x++)
            {
            Destination->Canvas->Pixels[w - x][h - y] = Source->Canvas->Pixels[x][y];
            }
        }
    Pour une rotation à 90° à gauche ou 270° à droite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Destination->Width = Source->Height;
    Destination->Height = Source->Width;
    for(int y = 0; y < Source->Height; y++)
        {
        for(int x = 0; x < Source->Width; x++)
            {
            Destination->Canvas->Pixels[y][w - x] = Source->Canvas->Pixels[x][y];
            }
        }
    A plus !

Discussions similaires

  1. Log-Polar transform d'une Image avec Scilab
    Par Saeiddieas dans le forum Scilab
    Réponses: 0
    Dernier message: 19/05/2015, 03h58
  2. Capture d’écran et transformation de Div en image avec Javascript
    Par jawharsidhom dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/11/2013, 18h56
  3. Economie de mémoire pour plusieur images avec la même source
    Par neness dans le forum Composants VCL
    Réponses: 5
    Dernier message: 18/01/2004, 11h56
  4. PB affichage d'image avec IE
    Par arturo dans le forum Modules
    Réponses: 6
    Dernier message: 25/09/2003, 18h28
  5. [VB6] Affichage d'image avec qlq contraintes
    Par youri dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 15h44

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