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 :

Récupérer les données BMP à partir d'une DLL


Sujet :

Langage Delphi

  1. #21
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Pour bien comprendre, dans le 2ème appel à GetImageData, on lui passe "@LBuffer[0]", ça veut dire quoi concrètement ?
    Ca veut dire que tu passes en paramètre l'adresse du premier élément du tableau.

    Aussi la violation d'accès sur le move, que se passe t il exactement dans cette instruction ?
    Le move sert à recopier un bloc de données vers un autre.
    Dans mon exemple, on recopie les données de LBuffer[n] dans la ligne n° i du bitmap.

    ScanLine[i] retourne un pointeur sur les données de la ligne i.
    Si le bitmap est au format 24 bits, ca veut dire que chaque pixel est un triplet (Rouge, Vert, Bleu) donc 3 octets par pixels. C'est pour ça qu'on fait la copie sur une longueur de nWidth*3.

    Remarque normalement, on devrait aussi avoir :
    nBufferSize = nWidth*nHeight*3.

    Si nBufferSize est plus petit, tu auras un acces violation lors des Move. Mais dans ce cas, ça veut dire que ton image n'est pas au format RGB24.

    Donc pour commencer, tu peux regarder quels sont les valeurs de nBufferSize, nWidth et nHeight après l'appel à GetImageData.
    Et surtout regarde la valeur de nBufferSize/(nWidth*nHeight), ça te donnera la taille d'un pixel en octets, ce qui permet pratiquement de déterminer le format de l'image.

    Autre chose également, regarde à quelle ligne du bitmap tu obtiens l'erreur (pour quel i et pour quel n).

  2. #22
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Je vois, tout s'éclaircit petit à petit.

    Je viens de me rendre compte que le nWidth et nHeight ne sont pas les dimensions en pixels de l'image mais :
    o_nPhysicalWidth Physical width of this image in nm
    o_nPhysicalHeight Physical of this image in nm
    hors c'est bien la dimension en pixels qu'il faut pour ton calcul je pense :
    nBufferSize = nWidth*nHeight*3
    j'avais un bufferSize à 750 000, un nWidth à 228 000 et nHeight à 227 000...
    évidemment le BufferSize avec ces valeurs était trop petit, d'où la violation d'accès comme tu disais.

    En fait je définis avant l'appel à GetImageData la résolution en pixels de l'image désiré par une autre fonction "SetCameraResolution(500,500)".
    (du 500 par 500 pixels !)

    avec ces valeurs, cela fonctionne parfaitement ! (je te dois un grand merci Franck)

    petite question :
    Si le bitmap est au format 24 bits, ca veut dire que chaque pixel est un triplet (Rouge, Vert, Bleu) donc 3 octets par pixels. C'est pour ça qu'on fait la copie sur une longueur de nWidth*3.
    Si je travaille avec du 16 ou 32 bits, comment remanier l'algorithme de parcours et scan du buffer ?

  3. #23
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par KRis Voir le message
    Si je travaille avec du 16 ou 32 bits, comment remanier l'algorithme de parcours et scan du buffer ?
    C'est simple, en RGB24 tu as 3 octets par pixel.
    En 16 bits (RGB16 ou RGB15) tu as 2 octets par pixel.
    En 32 bits (ARGB (j'ai un doute sur le nom)) tu as 4 octets par pixel.

    Donc en fait tu as :
    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
    33
    34
     
    var
      TailleLigne : integer; // Taille d'une ligne en octets
      Largeur : integer; // Largeur de l'image en pixels.
      Hauteur : integer; // Hauteur de l'image en pixels.
      pf : TPixelFormat; // Format de l'image
      LBuffer : array of byte;
      bmp : TBitmap;
      n : integer;
      i : integer;
    begin
      ... // Initialiser les valeurs : Largeur, Hauteur, pf et LBuffer
     
      case pf of
      pf15bit, pf16bit:
        TailleLigne := Largeur*2;
      pf24bit:
        TailleLigne := Largeur*3;
      pf32bit:
        TailleLigne := Largeur*4;
      else Raise Exception.Create('Format non géré !');
      end;
     
      bmp := TBitmap.Create;
      bmp.Width := Largeur;
      bmp.Height := Hauteur;
      bmp.PixelFormat := pf;
      n := 0;
      for i := 0 to Hauteur-1 do
      begin
        move(LBuffer[n], bmp.ScanLine[i]^, TailleLigne);
        inc(n, TailleLigne);
      end;
    end;

  4. #24
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Encore merci Franck pour m'avoir aider à y voir plus clair et à démêler beaucoup de noeuds.
    Je tagge ce post en résolu !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/07/2009, 08h12
  2. [OpenOffice][Base de données] Récupérer les données aprés sélection dans une combobox
    Par frack dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 06/02/2009, 09h27
  3. comment récupérer les données dans contact sur une feuille excel?
    Par Granfred dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/01/2009, 15h02
  4. Réponses: 0
    Dernier message: 09/10/2008, 08h02
  5. Récupérer les donnees a partir d'une dataview
    Par rar77 dans le forum VB.NET
    Réponses: 1
    Dernier message: 22/11/2007, 22h21

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