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 :

Charger une image .png ou .jpeg dans une matrice


Sujet :

C++Builder

  1. #1
    Inactif
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Bonsoir,

    L'image .png est une image compressée, donc comment la charger sous C++ Builder afin de la stocker dans une matrice d'entiers ?

    Est-ce qu'il faudra impérativement la convertir en .bmp ou bien y a-t-il une autre solution ?

    Et pourquoi la boîte de dialogue OpenPictureDialog nous permet de sélectionner les formats .jpeg et .png, mais quand on choisit une telle image, on aura le message d'erreur EInvalidGraphic ?

    Merci.

  2. #2
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Ajoute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "jpeg.hpp"
    et tu pourras ouvrir des images Jpeg sans problème et il me semble aussi les png mais je suis pas sur

  3. #3
    Inactif
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par kurul1 Voir le message
    Ajoute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "jpeg.hpp"
    et tu pourras ouvrir des images Jpeg sans problème et il me semble aussi les png mais je suis pas sur
    Oui, ça marche pour les images .jpeg mais pas pour les .png car mon application devrait ouvrir aussi les images .png ?

    Autres questions :
    1. Après le chargement d'une image (.jpeg ou .png), est-ce qu'elle va être décompressée ou bien ça reste compressée ?
    2. Est-ce qu'il est préférable de la charger dans un TImage pour ensuite faire des traitements dessus, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
    Ou bien, la charger directement dans une matrice d'entiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int image[MAX_HAUTEUR][MAX_LARGEUR]
    Dans ce cas-là, je ne sais pas trop comment procéder ?

    Merci.

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut paronyme
    Fait une recherche sur le Forum avec " png ", je pense que tu va trouver des reponses

  5. #5
    Inactif
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par benj63 Voir le message
    Bonjour,

    Je manipule des images PNG (plan de sites), en dessinant dessus différentes figures (bâtiments, etc).

    Pour les PNG, j'utilise l'unité pngimage.hpp fournie avec Borland C++ Builder 6.
    J'ai farfouillé dans les répertoires C++ Builder mais je n'ai pas trouvé cette unité !

    Y a-t-il une unité à inclure pour pouvoir gérer les .png sans avoir recours à installer un composant ?

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    C'est un ajout au prog fait une recherche dans le Forum

  7. #7
    Inactif
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Je n'arrive toujours pas à charger une image jpeg dans un TImage pour pouvoir la lire pixel par pixel et faire des traitements dessus.

    Voilà le code que j'avais écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if (OpenPictureDialog1->Execute())
    {
      TJPEGImage *jpg = new TJPEGImage();
      jpg->LoadFromFile(OpenPictureDialog1->FileName);
      Image1->Picture->Assign(jpg);
     
      hauteur = Image1->Height;
      largeur = Image1->Width;
     
      for (int i = 0; i < hauteur; i++)
        for (int j = 0; j < largeur; j++)
          image[i][j] = Image1->Canvas->Pixels[i][j];
    }
    Après l'exécution, j'aurai le message d'erreur suivant :
    Notification d'une exception du débogueur

    Le projet Project1.exe a provoqué une classe d'exception EInvalidOperation avec le message 'Une image ne peut être modifiée que si elle contient un bitmap'. Processus stoppé. Utilisez pas-à-pas ou Exécuter pour continuer.
    Pourriez-vous m'aider s'il vous plaît ?

  8. #8
    Inactif
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par henderson Voir le message
    Salut !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TJPEGImage*image = new TJPEGImage();
    ....
     
    //convertir l'image jpeg en bitmap
    Image1->Picture->Assign(image); //<< image est vide à ce stade...
     
    Image1->Picture->LoadFromFile(OpenDialog1->FileName); // << ici alors ???
    Si j'avais disposé de TJPEGImage, alors j'aurais chargé l'image jpg dans image pour l'assigner ensuite vers le bitmap de Image1.
    Non ?

    A plus !
    Franchement, je n'ai pas compris ce message ?

    Je peux savoir la différence entre :
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1->Picture->Width;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1->Canvas->Pixels[i][j];
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1->Picture->Bitmap->Canvas->Pixels[i][j];
    Je suis toujours bloqué !

  9. #9
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 131
    Points : 65
    Points
    65
    Par défaut
    La on accéde a TImage ca veut dire qu'on prend le Width de TImage et non pas de l'image réel charger.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1->Picture->Width;
    Ici c'est le Width de ton image qui est charger.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1->Canvas->Pixels[i][j];
    Ici on lit les pixels de l'image charger.
    mais des fois pour lire l'image JPEG on doit introduire le #include"jpeg.hpp".on doit convertir l'image pour lire son Bitmap.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1->Picture->Bitmap->Canvas->Pixels[i][j];
    j'espere que je me trempe pas jusqu'au la.
    alors pour ca on lit l'image mais avec son Bitmap.
    alors pour vous éclaircir la .
    tu as qu'a faire comme ceci.
    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
    TJPEGImage*image = new TJPEGImage();
     image->Palette;
     image->PaletteModified=false;
     image->Grayscale=true;
    //affichage de l'image jpeg en Image1 de TImage
      image->LoadFromFile(OpenDialog1->FileName);
      Image1->Picture->Bitmap->Assign(image);
     
     
     
    //affectation de la hauteur et largeur réel de l'image
       Width_pic=Image1->Picture->Width ;
       Height_pic=Image1->Picture->Height;
     
     for(i=1;i<Width_pic;i++)
    {
     for(j=1;j<Height_pic;j++)
     {
    TColor col=Image1->Picture->Bitmap->Canvas->Pixels[i][j] ;}}
    j'espere que j'ai etait claire sinon tu voit ou tu n'a pas compris et je'expliquerai plus.bonne chance

  10. #10
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Comme je ne dispose pas de la classe TJPEGImage et comme il suffit de consulter la FAQ, je suppose, en toute logique que la séquence des événements est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TJPEGImage *image = new TJPEGImage();
    image->LoadFromFile(filename);
    Image1->Picture->Bitmap->Assign(image);
    delete image
    A ce stade, les dimensions du bitmap (Image1->Picture->Bitmap) sont celles de l'image décompressée (dimensions réelles de l'image).
    Comme TImage est une lucarne dans la quelle se dessine le bitmap (avec ou sans stretch), les dimensions de Image1 sont celles qu'on veut bien lui donner.

    A plus !

  11. #11
    Inactif
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Bonsoir !

    Pour manipuler chaque pixel, qui doit être compris entre 0 et 255, d'une image (jpeg après sa décompression) en niveaux de gris, est-ce qu'il correct d'écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BYTE couleur = Image1->Picture->Bitmap->Canvas->Pixels[col][lig];
    Ou bien récupérer chacune des composantes Rouge, Verte et Bleue, faire leur somme et diviser par 3 ?

    Et je cherche toujours comment lire une png à la manière d'une jpeg ?

    Merci à vous tous !

  12. #12
    Inactif
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Est-ce qu'il y a une différence entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Byte couleur = Image1->Picture->Bitmap->Canvas->Pixels[col][lig];
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int couleur = Image1->Picture->Bitmap->Canvas->Pixels[col][lig];
    ?

    Car dans mon programme, je voulais choisir une seule palette de type qui est int !
    Quand je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int couleur = ...;
    ShowMessage(IntToStr(couleur));
    J'aurai en affichage une valeur qui n'est pas comprise entre 0 et 255 (je manipule une image en niveaux de gris, ci-jointe) ? Est-ce normal, ou bien la fonction IntToStr ajoute des caractères à la chaîne qui s'affiche ?
    Images attachées Images attachées  

  13. #13
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 131
    Points : 65
    Points
    65
    Par défaut
    bonjour.moi aussi jecherche toujours de meme avec toi comment lire les images de format png,et en plus tiff.
    alors par passage j'ai trouvé ce lien ,je n'est pas encore essayer mais j'ai dit de te le passé peut etre ca va t'intéresser et on sera deux pour résoudre ce probleme.
    voici le lien
    http://lebdenat.africa-web.org/artic...id_article=126

  14. #14
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Pixels[X][Y] renvoie un type TColor quel que soit le bitmap (8 ou 24 bits ...).
    Si la couleur est un niveau de gris, il suffit d'extraitre l'une des composantes (R, G ou B) puisqu'un niveau de gris se caractérise par la relation R = G = B !

    On serait en fait tenté d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TCanvas *C = Image1->Picture->Bitmap->Canvas;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Byte gris = GetRValue( C->Pixels[x][y] );
    Les dimensions réelles sont celles du bitmap et non celles de l'image (en tant que TImage) !

    Notons qu'on perd un temps fou à traiter avec Pixels, et il vaut mieux utiliser ScanLine dans ce qui pourrait être un traitement d'image.

    A plus !

Discussions similaires

  1. Sauvegarder un texte dans une image png
    Par sousou12 dans le forum Général Java
    Réponses: 1
    Dernier message: 15/02/2014, 23h08
  2. Réponses: 11
    Dernier message: 08/11/2007, 19h01
  3. coment convertir une image de forlat JPEG a une forma tif
    Par sanfour_walhan dans le forum Delphi
    Réponses: 1
    Dernier message: 01/08/2006, 16h04
  4. n'affiche pas une image arriere plan definis dans une CSS
    Par mikebranque dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 30/06/2006, 15h54
  5. inserer une image et du texte dans une Jlist
    Par cellestion dans le forum Composants
    Réponses: 4
    Dernier message: 03/03/2006, 23h47

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