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 :

récupérer pixels images c++ builder


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Par défaut récupérer pixels images c++ builder
    Bonjour,

    je souhaite récupérer les pixels de deux images (enregistrées dans mon répertoire de travail) mais je ne m'en sort pas !

    Je ne récupère que les pixels de couleur noir (4294967295 ou 0xFFFFFFFF en hexa) alors que l'image n'est pas noire (hormis quelques pixels)!

    Voici mon code:
    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
     
            imJpeg->LoadFromFile("image.jpg");
            imJpeg2->LoadFromFile("image0.jpg");
            Image1->Picture->Assign(NULL);
            imBmp->Assign(imJpeg) ;
            imBmp2->Assign(imJpeg2) ;
            int w= imBmp->Width;
            int h = imBmp->Height;
            int k=0, l=0;
     
            hGdiBitMap = imBmp->Handle;
            i=j=0;
     
            FIHM2->Show();
            TRect rect(0,0,w,h);
            Image1->Canvas->CopyRect(rect, imBmp->Canvas, rect);
            for (j=0; j <  Image1->Picture->Bitmap->Height; j++)
            {
     
                    for (i =0; i < Image1->Picture->Bitmap->Width; i++) {
     
                            coulPix = GetPixel(hGdiBitMap, i, j);  //RGB
                            GetBValue(coulPix);
                            Image1->Canvas->Pixels[i][j] = coulPix;
                            FIHM2->Image2->Canvas->Pixels[i][j] = coulPix2;
     
                    }
                    Image1->Refresh();
                    Sleep(10);
                    Application->ProcessMessages();
           }
    Je charge les images sur mon IHM et j'utilise le pas à pas pour vérifier les valeurs des pixels .

    Je ne comprends pas. Devrais-je faire autrement? Quelles sont mes erreurs?

    Ça fait plus d'un mois que je suis dessus et j'ai pris énormément de retard pour mon projet de BTS. Si vous pouvez m'aider ou me conseiller juste un peu ça serait vraiment simpa. J'attends vos conseils ! Merci

  2. #2
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    Salut,

    ça fait un bail que j'ai plus fait de borland mais de mon temps il me semble que je faisais un truc avec ScanLine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(int i = 0; i < image->Picture->Bitmap->Height; ++i)
    {
         unsigned char * pixel = (unsigned char *)image->Picture->Bitmap->ScanLine[i];
     
         for(int j = 0; j < image->Picture->Bitmap->Width; ++j)
         {                       
              unsigned char b = *pixel++;
              unsigned char g = *pixel++;
              unsigned char r = *pixel++;
         }
    }
    Si ça peux aider ...

    Flo.

  3. #3
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Par défaut
    Il faut effectivement utiliser ScanLine, qui est mal documenté mais Flo. montre un exemple.
    Un autre problème possible peut venir du format de pixle de votre objet TBitmap. Le champ PixelFormat permet de définir sa taille:
    Bitmap->PixelFormat = pf8bit;
    D'autres tailles sont possibles, en RGB il faudra pf24bits. Utilisez le Ctrl+Click sur pf8bit pour aller à la définition. Chez moi ça donne:
    enum TPixelFormat { pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom };

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Par défaut
    Franchement merci beaucoup de votre aide ça m'a beaucoup aidé !

    J'ai essayé ce que vous m'avez dit et j'arrive à récupérer des pixels par contre j'essaie de l'afficher dans un TImage mais je n'y arrive pas.

    Est-ce que vous savez comment on met les pixels (r,v,b) dans une autre variable de type TBitmap* ?

    J'ai essayé cela mais en vain

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       r = *pixelImg1++;
       v = *pixelImg1++;
       b = *pixelImg1++;
       pix[0] = r;
       pix[1] = v;
       pix[2] = b;
       imBmp2->Canvas->Pixels[i][j] = atoi(pix);
    r, v, b et pix sont des unsigned char.

    Encore merci pour votre aide !

  5. #5
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    Salut,

    encore une fois, je ne suis pas sur de mon coup.

    Voilà ce que j'écrirais moi en supposant qu'il s"agisse d'images RGB (en niveaux de gris il faut remplacer le 3 par un 1).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int i = 0; i < imageSrc->Picture->Bitmap->Height; ++i)
    {
         unsigned char * pixelSrc = (unsigned char *)imageSrc->Picture->Bitmap->ScanLine[i];
         unsigned char * pixelDst = (unsigned char *)imageDst->Picture->Bitmap->ScanLine[i]; 
         std::copy(pixelSrc, pixelSrc + 3 * image->Picture->Bitmap->Width, pixelDst);
    }
    ou sinon de manière plus triviale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for(int i = 0; i < imageSrc->Picture->Bitmap->Height; ++i)
    {
         unsigned char * pixelSrc = (unsigned char *)imageSrc->Picture->Bitmap->ScanLine[i];
         unsigned char * pixelDst = (unsigned char *)imageDst->Picture->Bitmap->ScanLine[i]; 
     
         for(int j = 0; j < imageSrc->Picture->Bitmap->Width; ++j)
         {                       
              *pixelDst++ = *pixelSrc++; // copie du B
              *pixelDst++ = *pixelSrc++; // copie du G
              *pixelDst++ = *pixelSrc++; // copie du R
         }
    }
    Peut-être j'ai tout faux.

    Flo.

  6. #6
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    En fait il faut éviter de passer par Pixels[i][j] pour accéder à la valeur des pixels. C'est intéressant pour accéder aux valeurs des pixels de manière sporadique ; style pour récupérer la valeur du pixel sous la souris. Mais pour accéder rapidement à tous les pixels, il faut passer par le ScanLine.

    Flo.

Discussions similaires

  1. Récupérer pixel d'une image
    Par o-sys dans le forum Interfaces Graphiques en Java
    Réponses: 11
    Dernier message: 29/08/2012, 15h42
  2. [Mpeg4] récupérer une image d'un flux MPEG4.
    Par Drizztrobber dans le forum Multimédia
    Réponses: 10
    Dernier message: 19/03/2007, 10h01
  3. récupérer une image du presse papier
    Par amelhog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/08/2005, 10h18
  4. [Swing] récupérer une image d'un composant
    Par klemouf dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/09/2004, 10h24
  5. Récupérer 1 image insérée ds 1 contrôle "Picture"
    Par Yacine95000 dans le forum MFC
    Réponses: 18
    Dernier message: 05/08/2004, 18h08

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