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 :

Problème graphisme avancé


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Problème graphisme avancé
    Bonjour,

    J'ai éctit l'algo suivant pour construire un masque sur un Bitmap identifiant les plages d'une couleur prédéfinie avec une certaine tolérance (une sorte de baguette magique) et pour en calculer la couleur moyenne.

    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
     
      Nbr:=0;
      SigmaR:=0;
      SigmaG:=0;
      SigmaB:=0;
      Setlength(Mask.Bool,BMP.Width,BMP.Height);
      for j := 0 TO BMP.Height-1 DO
      begin
        Row := BMP.Scanline[j];
        for i := 0 TO BMP.Width-1 DO
        begin
          Mask.Bool[i,j]:= ((Row[i].rgbtRed<=RSup) and (Row[i].rgbtRed>=RInf)) and
                     ((Row[i].rgbtGreen<=GSup) and (Row[i].rgbtGreen>=GInf))  and
                     ((Row[i].rgbtBlue<=BSup) and (Row[i].rgbtBlue>=BInf));
          if Mask.Bool[i,j] then
          begin
            inc(Nbr);
            SigmaR:= SigmaR+Row[i].rgbtRed;
            SigmaG:= SigmaG+Row[i].rgbtGreen;
            SigmaB:= SigmaB+Row[i].rgbtBlue;
          end
          else BMP.Canvas.Pixels[i,j]:= clMask;
        end
      end;
      if Nbr=0 then exit;
      SigmaR:= SigmaR div Nbr;
      SigmaG:= SigmaG div Nbr;
      SigmaB:= SigmaB div Nbr;
      Mask.AverageColor:= RGB(SigmaR,SigmaG,SigmaB);
    la variable Row est définie comme grhRGBTripleArrayPtr telque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // For pf24bit Scanlines
      grhRGBTripleArrayPtr = ^grhRGBTripleArray;
      grhRGBTripleArray = array[0..MaxPixelCount-1] of TRGBTriple;
    Le problème est le suivant :
    Cet algo fonctionne parfaitement dans le projet 1 que j'ai écrit pour sa mise au point mais il ne fonctionne plus dans le projet 2 auquel je le destinais.

    Dans le projet 2 le compilateur déclanche une violation d'accès dès la valeur i=1 à la ligne ou il initialise MaskBool en valeur. Au pas à pas j'ai observé à la valeur i=0 que les valeurs de type Row[i].rgbtRed sont initialisées et lisibles sous l'EDI et ne le sont plus à la valeur i=1 et sont illisibles sous l'EDI d'où sans doute l'origine de l'erreur.

    Une différence importante entre les projets, qui est sans doute à l'origine de ce problème, c'est que le projet 1 travaille sur le bitmap d'une image chargée dans un Timage par la fonction Image.Picture.LoadFromFile(Opendialog1.Filename); dans laquelle le fichier image chargé possède l'extension BMP alors que le projet 2 travaille sur un bimap qui provient d'une fonction Canvas.CopyRect sur un Timage à l'origine chargée sur un fichier JPEG. j'ai cependant pris la précaution d'affecter le format pf24bit aux Bitmaps utilisées.

    Quelqu'un comprend-il ce qui se produit ? auquel cas comment corriger le problème ?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Je viens de faire l'essai dans le projet 1 avec JPEG
    Le problème ne vient pas du fait que l'image originale ait été chargée en JPEG. Je viens de reprendre le projet 1 en chargeant une image Jpeg et ça marche !

    Alors j'essaie le projet 2 en plaçant la fonction LoadImage du projet 1 et ca marche aussi en Jpeg et en BMP !!!!

    Le problème se produit uniquement quand l'image est transférée d'une form1 vers une form2 de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      Form2:= TForm.Create( nil );
      try
        Form2.image1.Width:= P2.X-P1.X;// largeur demandée
        Form2.image1.Height:= P2.Y-P1.Y;// hauteur demandée
        Form2.image1.Canvas.CopyRect(RectCible,Image1.Canvas,ImgRect);
        Ok:=Form2.ShowModal=IDOK;
      finally
        frmMask.Destroy;
      end;
    Si quelq'un comprend qu'il m'expliaque je ne veux pas mourir idiot

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Cherchez plus j'ai trouvé
    J'ai contourné le problème en passant par un fichier image temporaire et ça marche

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

Discussions similaires

  1. [XL-2010] Problème Filtre avancé avec VBA
    Par jppnancy dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 12/04/2015, 10h35
  2. Problème recherche avancée
    Par Alfred12 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 3
    Dernier message: 10/03/2015, 11h32
  3. [XL-2007] Problème filtre avancé
    Par trane51 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 23/06/2011, 17h19
  4. Problème binding avancé
    Par zenadrith dans le forum Silverlight
    Réponses: 4
    Dernier message: 16/04/2010, 18h15
  5. Réponses: 1
    Dernier message: 08/04/2008, 14h17

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