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 :

manipuler les images .bmp(en tant que matrices)


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut manipuler les images .bmp(en tant que matrices)
    j'ai une image BMP,je veux la recuperer dans une matrice,pour lui infliger des traitement ,comment je dois faire?
    et je voulais aussi ouvrir un fichier contenant des images .bmp
    mais ça ne marche pas voici le code que j'ai utilisé:


    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
    // Cet exemple montre le dessin direct dans le Bitmap
    Byte *ptr;
    try
    {
    pBitmap->LoadFromFile("C:\\DocumentsandSettings\\attyiddir\\mes documents\\Nouveau dossier\\kahina.bmp ");//le chemin d'une image bitmap
    for (int y = 0; y < pBitmap->Height; y++)
    {
    ptr = (Byte *)pBitmap->ScanLine[y];

    for (int x = 0; x < pBitmap->Width; x++)
    ptr[x] = (Byte)y;
    }
    Canvas->Draw(0,0,pBitmap);
    }
    catch (...)
    {
    ShowMessage("Impossible de charger ou modifier le bitmap");
    }
    delete pBitmap;
    }
    merçi pour l'aide

  2. #2
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut,
    juste 2/3 choses:

    - Ne poste pas 2 fois la même question, une seule suffit pour que l'on te réponde.

    - Lis les règles du forum, ca peux être utile et t'expliquer comment bien poser ta question et utiliser les outils du forum.

    - Lorsque tu tapes du code, tape le entre les balises [ CODE ] qui apparaissent quand tu clic sur le # au dessus de la zone de saisie.

    - il existe une recherche sur le site et sur le forum. Elle te permettent de trouver pas mal de réponse aux questions que d'autres ont peut être posé avant toi.

    - En expliquant tout ce que tu as fait et ce que tu veux (au besoin donne un exemple) on pourra mieux t'aider.

    En utilisant la recherche du forum j'ai trouvé ces liens:
    http://www.developpez.net/forums/sho...=image+matrice
    http://www.developpez.net/forums/sho...=image+matrice

    Et s'il te plait si tu as résolu ton problème précise le en cliquant sur la case et si tu as utilisé d'autres méthodes que c'elles que l'ont a pu t'apporter, précise le ca peux aider les autres qui seront confronté au même problème que toi.

    Merci et bon courage

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut
    merçi pour l'aide
    mais pour les deux liens je les ai déja vus ,et ça n'a pas marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      for (int i=0;i<=256;i++)
      {
         for (int j=0;j<=256;j++)
       {
      Image2->Canvas->Pixels[i][j];
       } }
    }
    a chaque fois il m'affiche image blanche

  4. #4
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Normal qu'il n'y ait rien puisque ce code ne fait rien !

    A plus !

  5. #5
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut
    Salut,
    Pour charger une image tu dois glisser sur ta forme un openPictureDialog,
    ensuite tu écris le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    OpenPictureDialog1->Filter = "Bmp file(*.bmp)|*.BMP";
    if (OpenPictureDialog1->Execute())
    {
    Image2->Picture->Bitmap->LoadFromFile(OpenPictureDialog1->FileName);
    }
    }
    A+

  6. #6
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    Bonjour,

    attention à l'exemple qui est donné dans l'aide CBuilder:

    ScanLine permet de scruter chaque ligne d'un Bitmap.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptr = (Byte *)pBitmap->ScanLine[y];
    Ensuite au sein de cette ligne, on peut interroger pixel par pixel pour connaitre la valeur de chacun d'eux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (int x = 0; x < pBitmap->Width; x++)
    ptr[x]...
    Dans cette exemple, on inscrit dans chaque pixel une valeur octet qui correspond au numéro de la couleur dans la palette du Bitmap.
    Mais cette valeur n'est pas véritablement une couleur au sens RGB.
    Pour bidouiller pixel par pixel, il vaut mieux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonBitmap->Canvas->Pixels[x][y] = une_valeur;
    L'exemple fournit dans l'aide fonctionne, mais l'anomalie peut provenir du fait que l'image que tu veux charger dans le bitmap n'existe pas à l'emplacement spécifié.
    Et comme tu utilises la gestion des exception
    le programme échoue et n'entame pas le traitement du bitmap.

  7. #7
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Le problème est qu'il faudrait être sûr que le bitmap à une définition de 8 bits et dans ce cas, ScanLine donne l'index de la couleur dans la palette du bitmap.

    Si ce bitmap est un 24 bits, ScanLine peut lire les 3 composantes de la couleur pour le pixel. Dans ce cas, pour chaque pixel, il vaut mieux traiter comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pByte = (Byte*)...ScanLine[y];
    for(...x,....)
        {
        pByte[0] = ?;
        pByte[1] = ?;
        pByte[2] = ?;
        pByte = pByte + 3; //pixel suivant
        }
    Avant de charger le bitmap, on peut se servir d'un AnsiString pour contenir le chemin complet du bitmap et tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    AnsiString Filename = "....";
    if(FileExists(Filename))
        {
        //.... on tient notre bitmap
        Bitmap->LoadFromFile(Filename);
        //...
        }
    A plus !

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut
    pour ouvrir un fichier image,c'est bon
    mais pour acceder aux pixels d'une image,pour la manipuler
    je ne suis pas arrivée!!
    voulez vous bien m'aider et me donner le bon code source,sil vous plait
    en m'expliquant les etapes à poursuivre
    merci

  9. #9
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Je vais réaliser une conversion en niveau de gris.
    Le bitmap source est stocké dans un TImage.
    Il s'agit d'un 24 Bits donc je vais traiter directement avec les composantes RGB de chaque pixel.
    Pour gagner du temps je vais utiliser ScanLine[Y], Pixels[X][Y] m'en ferait perdre !
    La conversion est stockée dans un tableau dont les dimensions sont celles du bitmap.
    J'aime bien organiser mes tableaux d'images en tant que ligne (y) * col (x) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Byte I[480][640]; //le type Byte est suffisant pour mes niveaux de gris
    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
    Graphics::TBitmap *B = Image1->Picture->Bitmap;
    int we = B->Width;
    int he = B->Height;
    Byte *P;
    Byte g;
    for(int y = 0; y < he; y++) //ligne par ligne
        {
        P = (Byte*)B->ScanLine[y];
        for(int x = 0; x < we; x++) //pixel par pixel
            {
            //conversion en niveau de gris
            g = (Byte) (((P[0] * 11) +  //bleu     
                         (P[1] * 59) +  //vert
                         (P[2] * 30)) / 100); //rouge
            //Le niveau de gris dans mon tableau
            I[y][x] = g;
     
            //report dans le bitmap
            //gris est tel que : rouge == vert == bleu == niveau de gris)
            P[0] = g; // le bleu 
            P[1] = g; // le vert
            P[2] = g; // le rouge
     
            //chaque pixel est composé de 3 octets consécutifs donc...        
            P = P + 3; //prêt pour le pixel suivant
            }
        }
    A la suite de ça, mon image est convertie en niveaux de gris.
    Le tableau est prêt pour un éventuel traitement (plus rapide par ce biais là).

    A plus !

Discussions similaires

  1. Librairie pour manipuler les images
    Par maa dans le forum C#
    Réponses: 3
    Dernier message: 11/04/2008, 18h33
  2. Réponses: 19
    Dernier message: 04/03/2008, 10h36
  3. manipuler les images .bmp
    Par amoeva dans le forum C++Builder
    Réponses: 1
    Dernier message: 23/04/2007, 13h13
  4. manipuler les image .BMP
    Par dz_robotix dans le forum C++Builder
    Réponses: 4
    Dernier message: 04/07/2006, 15h20
  5. [C#] Images PNG en tant que ressources
    Par GoldenEye dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/01/2006, 09h50

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