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

Delphi Discussion :

Vérification d'étendue avec Scanline


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Vérification d'étendue avec Scanline
    Bonjour à tous,

    'Delphi7, version Education Professionnelle sur Windows 7)

    Dans une même application, dans une première procédure j'utilise la fonction
    Scanline ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Var P:PByteArray;
                X,Y:Integer;
          Begin
         For Y:= bitmap1.height downto bitmap1.height-300 do
              begin
                P:=PByteArray(bitmap1.scanline[Y]);
                for x:=2 to bitmap1.Width-2800 do
                   begin
                    P[X]:=Y;
                    .......
                    .......
    et tout se passe bien.

    de suite après, j'utilise à la suite une seconde procédure avec la même construction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          Var P:PByteArray;
                X,Y:Integer;
          begin
             DivMod(bitmap1.width,2,resultat,reste);
             X:=resultat;
             for Y:=bitmap1.height downto bitmap1.height-250 do
             begin
                P:=PByteArray(bitmap1.scanline[Y]);
                P[X]:=Y;
                .......
                .......
    et je reçois le message d'erreur "exception ERangeError avec le message Erreur
    vérification d'étendue".
    Je peux supposer que je manque de mémoire mon bitmap1 comportant 3292 X 2172
    pixels.
    Comment résoudre ce problème ? je ne sais pas initialiser ce Pointeur P entre chaque
    procedure; Il devrait l'être par le lancement de la nouvelle ?
    Merci à vous de me guider.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Les premier pixel est à bitmap1.height -1.

    Le type de P dépendra de la profondeur des couleurs de l'image. PByteArray pour du 256 couleurs. Es-tu sûr de ça ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Verification d'étendue avec Scanline
    Voici mon code de création de bitmap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Image.Picture.Assign(image1.picture.graphic);
    Bitmap1:=Tbitmap.Create;
    Bitmap1.pixelformat:= pf24bit;
    Bitmap1.Assign(image.picture.graphic);
    je ne sais pas si cela va correspondre à du 256 couleurs.

    par ailleurs j'ai toujours le même problème en remplaçant
    "Bitmap1.height" par "Bitmap1.height-1"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Y:=1000;
     for X:=bitmap1.Width-1 downto bitmap1.Width-250 do
              begin
                   P:=PByteArray(bitmap.scanline[Y]);
                   P[X]:=Y;
                   ........
                   ........

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Utilise la balise [CODE] pour mettre en évidence ton code s'il te plaît (bouton # dans la barre d'outil).

    On ne sait pas ce qu'il y a dans image.picture, impossible à dire quelle est la profondeur des couleurs. Pour assurer du 24 bits il faudrait inverser ces deux lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Bitmap1.Assign(image.picture.graphic);
    Bitmap1.pixelformat:= pf24bit;
    et remplacer PByteArray par PRGBTriple.

    Ne sachant pas ce que tu veux faire précisément, difficile de t'aider plus mais par rapport à ce que tu montres, tu es en train de faire un remplissage partiel en dégradé

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Vérification d'étendue avec Scanline
    Re..Bonjour,
    Merci de vous pencher sur ce problème.
    j'ai inversé les deux lignes de code comme indiqué.
    Toujours le même problème.

    Pour ce qui est de remplacer "P:PByteArray;"
    par "P:PRGBTriple;" je ne sais pas comment l'utiliser dans le code. Pouvez-vous m'adresser la ligne de code à programmer pout ce faire.

    Ce que je souhaite faire : je prends 1 photo ".JPG" et je la convertis en Bitmap.
    Dans la première procédure je cherche les valeurs R G B du fond de la photo.
    Là mon code P[X]=Y passe très bien.
    Dans la seconde procédure je cherche à détecter les pixels couleurs
    d'une ligne médiane horizontale (ou verticale) selon orientation de la photo
    pour trouver l'abscisse (ou l'ordonnée) de l'objet en photo par le changement
    de couleur des pixels.
    Serait-ce un problème de mémoire ?

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par DanielPoinson Voir le message
    Pour ce qui est de remplacer "P:PByteArray;"
    par "P:PRGBTriple;" je ne sais pas comment l'utiliser dans le code. Pouvez-vous m'adresser la ligne de code à programmer pout ce faire.
    Il y a pas mal d'intevention sur DVP à ce sujet. Une petite recherche

    Citation Envoyé par DanielPoinson Voir le message
    Dans la première procédure je cherche les valeurs R G B du fond de la photo. Là mon code P[X]=Y passe très bien.
    Tu ne cherches rien du tout, tu écris la variable de boucle Y dans une des composantes couleur. D'où ma remarque sur le fait que tu génères un dégradé.
    Mais puisque Y est ici de type entier et que tu essayes de l'écrire dans un byte, tu reçois l'exception ERangeError si la "vérification des limites" est activée (sinon la valeur serait tronquée sur un octet).

    Citation Envoyé par DanielPoinson Voir le message
    Dans la seconde procédure je cherche à détecter les pixels couleurs
    d'une ligne médiane horizontale (ou verticale) selon orientation de la photo
    pour trouver l'abscisse (ou l'ordonnée) de l'objet en photo par le changement
    de couleur des pixels.
    Tu veux détecter la présence ou le déplacement d'un objet entre deux photos ?

    Citation Envoyé par DanielPoinson Voir le message
    Serait-ce un problème de mémoire ?
    C'est un problème de mémoire oui mais parce que ton code est faux.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Vérification d'étendue avec scanline
    Merci pour toutes vos explications.
    Elles m'ont été très utiles
    Et maintenant je viens de revoir mon code.
    Tout marche.

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

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