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 :

Lire la couleur d'une image jpeg


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut Lire la couleur d'une image jpeg
    Salut
    je veut lire une couleur dans un point précis d'une image que j'ai ouvert dans un Timage
    ce qui veut dire
    par exemple : je donne les coordonée X,Y
    ou mieux pointer la souris sur cette couleur et un timer detecte cette couleur et l'écris dans un tedit

    j'ai beau chercher dans plusieurs sources mais je trouve pas une solution exacte
    je ne sais quoi utiliser Scanline ou autre
    je peut déja savoir combien de couleurs se trouve dans une image

    Merci de m'aider

  2. #2
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 338
    Points : 383
    Points
    383
    Par défaut
    bonjour

    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
     
    Function Tgraph.CouleurPointEcran(x,y:Integer):TColor;
    Var
      Dc : HDC;
    begin   
      DC := CreateDC('DISPLAY',Nil,Nil,Nil);
      Try
        Result:=GetPixel(DC,X,Y);
      Finally
        DeleteDc(DC);
      End;
    end;
     
    Procedure machin
    var 
    T  :  Tcolor;
    point : TPoint;
    begin
          point := ClientToScreen(GetCursorPos); // La méthode ClientToScreen permet de convertir les coordonnées d'un point exprimées relativement au contrôle en coordonnées relatives à l'écran.
          T:=CouleurPointEcran(Point.x, point.y); // Appelez GetCursorPos pour déterminer les coordonnées écran actuelles du curseur de la souris.
    // et voilà ça devrait être bon
    ....
    end;
    et tout ceci est déjà soit dans la FAQ, soit sur le forum...!!

    à+

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    salut
    merci pour la réponse
    mais j'ai quelques bugs
    si tu peut m'éclairir un peu :

    voila le code que j'ai mis :
    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
    Function Tgraph.CouleurPointEcran(x,y:Integer):TColor;
    Var
      Dc : HDC;
    begin
      DC := CreateDC('DISPLAY',Nil,Nil,Nil);
      Try
        Result:=GetPixel(DC,X,Y);
      Finally
        DeleteDc(DC);
      End;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
    T  :  Tcolor;
    point : TPoint;
    begin
          point := ClientToScreen(GetCursorPos); // La méthode ClientToScreen permet de convertir les coordonnées d'un point exprimées relativement au contrôle en coordonnées relatives à l'écran.
          T:=CouleurPointEcran(Point.x, point.y); // Appelez GetCursorPos pour déterminer les coordonnées écran actuelles du curseur de la souris.
    // et voilà ça devrait être bon
    end;
     
    end.
    les bugs c'est dans :
    Function Tgraph.CouleurPointEcran(x,y:Integer):TColor;
    le prob : la fonction nécessite un type de résultat
    2: identificateur non déclaré X,Y
    j'ai resolu celui-la : j'ai mis dans var : X,Y : integer;
    et d'autres ...

    peut tu me dire la soluce stp

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    760
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 760
    Points : 499
    Points
    499
    Par défaut
    salut

    Ta fonction est appelé par ta form1 donc ta déclaration doit être :
    Function Tform1.CouleurPointEcran(x,y:Integer):TColor;

    bye

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut!

    Je propose ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
    couleur:TColor;
    r,v,b:integer;
    begin
      couleur:=Getpixel(getdc(0),mouse.cursorpos.x,mouse.cursorpos.y);
      r:=getrvalue(couleur);
      v:=getgvalue(couleur);
      b:=getbvalue(couleur);
      edit1.text:='$'+inttohex(couleur,6);
      Panel1.Color:=couleur;
    end;

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    merci
    je test et je vous répond tous

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    code ero-sennin : donne

    merci bcp ero-senin
    et a vous tous
    tu ma beaucoup aider merci une autre fois ca marche sans beug

  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Un petit alors ?

  9. #9
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    j'ai une autre question dans le meme theme
    je ne sais si je met résolu et je fais un nouveau message
    mais quand meme je met la
    as tu une idée pour donner un X,Y précis
    par exemple
    le programme va sur une valeur donnée (X,Y) dans un timage
    pas dans la form dans le timage
    merci de m'aider

  10. #10
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Je te propose une chose :

    Sur une form, tu places deux TEdit :
    - couleurSurvolee
    - couleurSelectionnee

    Tu y déposes également un TImage : monImage.

    Dans l'événement OnMouseMove du TImage, tu mets ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.monImageMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      couleur:integer;
    begin
      couleur:=Getpixel(getdc(0),mouse.cursorpos.x,mouse.cursorpos.y);
      couleurSurvolee.text:='$'+inttohex(couleur,6);
    end;
    Dans l'événement OnMouseUp (ou Down, au choix) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.monImageMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      couleur:integer;
    begin
      couleur:=Getpixel(getdc(0),mouse.cursorpos.x,mouse.cursorpos.y);
      couleurSelectionnee.text:='$'+inttohex(couleur,6);
    end;
    Logiquement, ça fait ce que tu souhaites (plus besoin du Timer )
    A+

  11. #11
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    merci pour cette explication M. ero senin ( jiraya sama ^_^)

    mais au faite je veut pas utiliser la souris mais par exemple : je donne les coordonée (X,Y) (X:40,Y:50) et le programme calcul tous seul la couleur dans le timage 5 juste dans le timage

    si tu as une idée sinon pas grave merci pour tous

  12. #12
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Bien sur que j'ai une idée

    Allons y
    Tout d'abord, je vais créer un record afin d'avoir accès non seulement à la couleur mais également à sa valeur Hexa ... :

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Image1: TImage;
        Button2: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    // Nouvel enregistrement
    TMyColor=record
       couleur:TColor;
       couleurHex:String;
    end;
     
    var
      Form1: TForm1;
     
    implementation
    Ensuite, je vais déclarer une fonction qui me retournera une variable du type TMyColor :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function donnerCouleur(CanvasSrc:TCanvas;PositionX:integer;PositionY:integer):TMyColor;
    var
      couleurSelectionnee:TMyColor;
    begin
      couleurSelectionnee.couleur:=Getpixel(getdc(0),PositionX,PositionY);
      couleurSelectionnee.couleurHex:='$'+inttohex(couleurSelectionnee.couleur,6);
      Result:=couleurSelectionnee;
    end;
    Pour finir, il ne me reste plus qu'à utiliser ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button2Click(Sender: TObject);
    var
      couleur:TMyColor;
    begin
      couleur:=donnerCouleur(Image1.Canvas,25,32);
      Edit1.Text:=couleur.couleurHex;
    end;
    Voila, j'espère que tout est OK... Je n'ai pas pris le soin de tester si on était dans la zone du TImage ...

  13. #13
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    merci ero_senin
    ca marche parfaitement mais le gros prob c'est qu'il faut mettre une bitmap
    et c'est contre mon application car j'ouvre des images Jpeg

    Tu connais une soluce ou c'est impossible ?

  14. #14
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par visualk Voir le message
    merci ero_senin
    ca marche parfaitement mais le gros prob c'est qu'il faut mettre une bitmap
    et c'est contre mon application car j'ouvre des images Jpeg

    Tu connais une soluce ou c'est impossible ?
    En fait, ça ne marchait pas ma solution précédente! Je n'étais pas dans le repère du TImage

    Bon, là comme ça, et surtout vu l'heure, je n'ai pas d'idée ...
    Faudrait "changer de repère" mais là, je n'ai jamais fait ...

  15. #15
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    oui c'est vrai on comparant avec l'autre code ( pour la souris )
    je viens de le remarquer ( il fallait aller dormir )
    sinon ta pas une autre soluce pour gerer tous ca ?

  16. #16
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Bon, voilà ce que je propose :

    Toujours pareil, je déclare mon Record :
    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
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Image1: TImage;
        Panel1: TPanel;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    type TMyColor=record
      couleur:TColor;
      couleurHexa:String;
    end;
    Ma fonction pour la récupérer la couleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function donnerCouleur(monImage:TImage;PositionX:integer;PositionY:integer):TMyColor;
    var
      couleurChoisie:TMyColor;
      positionDuPixel:TPoint;
    begin
      // Je convertis les coordonnées de mon TImage en Coordonnée Ecran.
      positionDuPixel:=monImage.ClientToScreen(Point(PositionX,PositionY));
      couleurChoisie.couleur:=Getpixel(getdc(0),positionDuPixel.x,positionDuPixel.y);
      couleurChoisie.couleurHexa:='$'+inttohex(couleurChoisie.couleur,6);
      Result:=CouleurChoisie;
    end;
    Et l'utilisation de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    var
      couleurSelectionnee:TMyColor;
    begin
      couleurSelectionnee:=donnerCouleur(Image1,50,50);
      Edit1.Text:=couleurSelectionnee.couleurHexa;
      Panel1.Color:=couleurSelectionnee.couleur;
    end;
    En espérant que cette fois ci, ça fonctionne...
    A+

  17. #17
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    quand je mettez les valeur X,Y c'étais deja la valeur du image dans l'ecran
    c'est pour cela que j'ai le meme code Hexa

  18. #18
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Nos posts se sont croisés!
    J'ai donné la solution dans le post précédent!

    Test le et dis moi quoi

  19. #19
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    wé on a posté en meme temps
    je test et je te donne le resultat

  20. #20
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    Chapeau
    ca marche cette fois ci meme si je change l'emplacement de la form et le timage ca reste la meme combinaison

    Merci ero_sinin pour ton grand aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [libjpeg] Lire une image jpeg
    Par Flaherty Mc Coillean dans le forum Débuter
    Réponses: 1
    Dernier message: 11/03/2011, 13h26
  2. Lire bit à bit une image JPEG
    Par moumoute15 dans le forum Images
    Réponses: 1
    Dernier message: 10/06/2006, 15h13
  3. [Graphique] Comment compter les couleurs d'une image ?
    Par yoghisan dans le forum API, COM et SDKs
    Réponses: 27
    Dernier message: 16/02/2005, 18h17
  4. Copier une image (jpeg) dans le presse papier
    Par benj63 dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2002, 14h51
  5. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 20h06

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