1. #1
    Membre habitué
    Profil pro
    Inscrit en
    mars 2010
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2010
    Messages : 160
    Points : 155
    Points
    155

    Par défaut Caractéristiques des Pixels - BGRA -

    Bonjour à tous,

    En cette froide journée J'ai besoin d'éclairages pour me mettre sur la voie de la bonne utilisation des caractéristiques d’une image à l'aide de Lazarus, problème auquel je me confronte pour la première fois. J'ai lu les diverses inforamation sur le sujet, ai téléchargé et installé les composanst BGRA mais...
    J'ai réussi à charger une image (image acquise par un scan à l'aide de Xnview et de mon imprimate Multifonction. Image au format au format 100*100 ppi en véritables niveaux de gris.
    Je cherche à récupérer Les caractéristiques d'un pixel quelconque de cette image (indice(s?)) caractérisant la couleur mais n'arrive pas à trouver les bonnes instructions. J'arrive seulement pour l'instant à afficher ( sur un form indépendant de l'image) à afficher les coordonnée du pixel.
    Ci après une partie de mon code :
    1 - la récupération de l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TF_VueImg.FormPaint(Sender: TObject);
     Var Img_Trait1W, Img_Trait1H : Integer ;
    begin
      Img_Trait1 := TBGRABitmap.Create(F_ChoixImg.FNE_Img.text) ;
      Img_Trait1.Draw(Canvas,0,0,True);
      Img_Trait1W := Img_Trait1.Width ;
      Img_Trait1H := Img_Trait1.Height ;
      F_ChoixImg.Ed_TaillImgW.Text := IntToStr(Img_Trait1W) ;
      F_ChoixImg.Ed_TaillImgH.Text := IntToStr(Img_Trait1H) ;
      F_ChoixImg.Lb_InfoTaille.Caption := 'Taille : ' + IntToStr(Img_Trait1W)+ ' * ' + IntToStr(Img_Trait1H)  + ' Pixels'  ;
     
    end;
    2- La partie que je cherche à renseigner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TF_VueImg.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
      Var PixImg : TBGRAPixel;
    begin
      F_VueImg.Cursor := CrCross ;
      F_ChoixImg.Lb_PosX.Caption := 'Pos. X : ' + intToStr(X) ;
      F_ChoixImg.Lb_PosY.Caption := 'Pos. Y : ' + IntToStr(Y) ;
     // CoulPix:=Img_Trait1.Pixels[X,Y] ;  CE QUI POSE pROBLEME
      F_ChoixImg.Lb_Color.Caption := 'Niveau gris : ' + IntToStr(CoulPix) ; // JE souhaite récupérer
      // la (les) informations sur le pixel pointé (info couleur  si possible nombre de 0 à N) N : 8 - 16 ou 256
    end;
    Je vous remercie par avance de vos lumières.

    Cordialement

    R.O.

  2. #2
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 814
    Points : 9 611
    Points
    9 611

    Par défaut

    Salut,

    j'ai trouvé ton texte extrêmement confus, je vais me concentrer sur ça :
    Citation Envoyé par OR34a Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     // CoulPix:=Img_Trait1.Pixels[X,Y] ;  CE QUI POSE pROBLEME
      F_ChoixImg.Lb_Color.Caption := 'Niveau gris : ' + IntToStr(CoulPix) ; // JE souhaite récupérer
      // la (les) informations sur le pixel pointé (info couleur  si possible nombre de 0 à N) N : 8 - 16 ou 256
    Ligne 1 tu nous dis "ce qui pose problème" mais tu ne nous dis pas le problème...

    Lignes 2 et 3, qu'est-ce que tu entends par "informations sur le pixel pointé (info couleur si possible nombre de 0 à N) N : 8 - 16 ou 256" ?
    Pourquoi n'y a-t-il pas 24 et 32 ?
    Et que vient faire 256 là-dedans ?

    Et qu'est-ce que tu entends pas "info couleur" ? IntToStr(CoulPix) ça fait penser à la couleur du pixel choisi quand N fait penser au nombre de bits du pixel (sauf pour 256).

    Bref, c'est le brouillard...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    mars 2010
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2010
    Messages : 160
    Points : 155
    Points
    155

    Par défaut a/s Couleur d'un pixel et GBRA

    Bonjour,

    En réponse à la remarque de Jipété. Effectivement, mon texte et surtout mon code sont un peu confus et c'est peut-être parce que je n'arrive pas à intuiter la solution. Je cherche à récupérer l'information concernant la couleur d'un pixel dans une image chargée à l'aide des composants BGRA.
    Je dispose d'une image en " gris véritable " assez simple (au moins pour mon image test) . Lorsque j'ouvre cette image à l'aide de XnView et que je la parcours en affichant les informations de couleur il s'affiche Index[09] ou 17 etc... et HTML #11.... #0A etc.. pour les parties les plus sombres et des valeurs d'Index> 150 pour les parties les plus claires ( HTML#00 ou autres). Ce qui m'intéresse est de récupérer ces valeurs pour pouvoir ensuite initier des calculs sur les valeurs de couleur claire.
    Depuis mon message, j'ai consulté plus attentivement la documentation Lazarus sur TColor et ai vu qu'il existait 2 types de Color : Le Tcolor Standard 'RGB3x 8 bits' et le TFPcolor utilisé pour FPLImage 'RGBA 4x 16 bits'.
    Ce qui m'a fait évoluer mon code qui est devenu :
    La variable CoulPix de mon code est une variable globale de Type Tcolor que je souhaiterai pouvoir récupérer. X et Y sont les coordonnées d'un pixel quelconque de l'image à traiter. et les lignes 3 et 4 du code affichent ces coordonnées dans un Tedit du formulaire de gestion de l'image.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin
      F_VueImg.Cursor := CrCross ;
      F_ChoixImg.Lb_PosX.Caption := 'Pos. X : ' + intToStr(X) ;
      F_ChoixImg.Lb_PosY.Caption := 'Pos. Y : ' + IntToStr(Y) ;
      CoulPix := FPColorToTColor(F_VueImg.Img_Trait1.Colors[X,Y]);
    Ce code s’exécute mais il plante à l'exécution sur un External SigVer error (image jointe) .Nom : erreurSigVer.JPG
Affichages : 50
Taille : 51,6 Ko
    J'espère que ce complément d'explication vous conviendra et que vous pourrez me mettre sur la voie.
    Cordialement

    R.O.

  4. #4
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 814
    Points : 9 611
    Points
    9 611

    Par défaut

    Toujours rien compris, , et pense à aérer tes messages avec des retour-chariots, regarde dessous :

    Tu te (nous !) noies sous des détails je dirais "métier" (récupération des infos en HTML) alors que tu n'arrives déjà pas à bêtement récupérer la couleur du pixel pointé par la position de la souris.

    Tu devrais te documenter sur les Color Pickers, une fois que tu auras la couleur tu pourras envisager son analyse.

    La base d'un Color Picker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var
      DC: HDC;
      Canvas: TCanvas;
      Couleur: TColor;
    Const
      HWND_DESKTOP = 0;
    begin
      DC := GetDC(HWND_DESKTOP);
      Canvas := TCanvas.Create;
      Canvas.Handle := DC;
      Couleur := Canvas.Pixels[Mouse.CursorPos.x, Mouse.CursorPos.y];
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 564
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 564
    Points : 9 495
    Points
    9 495

    Par défaut

    Une image en niveau de gris est généralement codée sur 8 bits. Pixels[X,Y] retourne un TColor, soit un entier sur 32 bits.
    En 24 ou 32 bits, un pixel gris aura les trois composantes RGB identiques. Il te suffit dès lors de filtrer pour extraire une seule composante qui te donnera ta valeur entre 0 et 255 : Pixels[X,Y] and $FF

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    mars 2010
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2010
    Messages : 160
    Points : 155
    Points
    155

    Par défaut a/s Couleur d'un pixel et GBRA

    Bonsoir à tous ...
    ... et merci pour les réponses même si des choses simples m'ont bêtement échappées lors de ma lecture des informations sur Tcolor. Les suggestions qui m'ont été faites m'ont permis de résoudre mon problème. Compte-tenu des options que j'ai prises dans le reste du code de l'application, le code fonctionnel est devenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TF_VueImg.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
      Var  CoulIndice : Integer ;
    begin
      F_VueImg.Cursor := CrCross ;
      F_ChoixImg.Lb_PosX.Caption := 'Pos. X : ' + intToStr(X) ;
      F_ChoixImg.Lb_PosY.Caption := 'Pos. Y : ' + IntToStr(Y) ;
      CoulPix := Canvas.Pixels[X,Y] ;
      CoulIndice := Green(CoulPix) ;
    Ce code renvoie bien pour la variable CoulIndice des nombres entre 0 et 255 comme je le souhaitais.

    Cordialement et merci.

    R.O.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [TImage] Transfert de Picture par pixels.
    Par H2D dans le forum Langage
    Réponses: 9
    Dernier message: 25/10/2003, 14h37
  2. Afficher une buffer de pixel avec Direct3D
    Par Black_Daimond dans le forum DirectX
    Réponses: 4
    Dernier message: 27/12/2002, 22h18
  3. [Kylix] RGB d'un pixel
    Par Kusanagi dans le forum EDI
    Réponses: 1
    Dernier message: 13/11/2002, 20h33
  4. [VB6] [Graphisme] Transfert d'image pixel par pixel
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 15/10/2002, 09h53
  5. Réponses: 2
    Dernier message: 30/05/2002, 10h19

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