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

API, COM et SDKs Delphi Discussion :

Récupérer VideoHDR dans un Bitmap


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Par défaut Récupérer VideoHDR dans un Bitmap
    Bonjour,

    Question simple, réponses simples trouvée en C, VB, etc. pas en delphi.

    Je fais une capture d'image depuis la WebCam en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    capSetCallbackOnFrame(hcam, Longint(@FrameCallBackProc));
    Parfait. Mais je veux maintenant tout simplement récupérer mon image en BitMap depuis la structure VideoHDR. Comment faire ?

    En clair, partant de le structure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type
        TVIDEOHDR               = record
            lpData              : PBYTE;                // pointer to locked data buffer
            dwBufferLength      : DWORD;                // Length of data buffer
            dwBytesUsed         : DWORD;                // Bytes actually used
            dwTimeCaptured      : DWORD;                // Milliseconds from start of
    comment je mets mes pixels dans la structure suivante:
    Par exemple, en VB, on fera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function FrameCallbackTarget(ByVal hwnd As IntPtr, ByRef lpVHdr As VIDEOHDR) As IntPtr
    Dim oBMP As New Bitmap(640, 480, 640 * 3,
    Imaging.PixelFormat.Format24bppRgb, New System.IntPtr(lpVHdr.lpData))
    PictureBox2.Image = oBMP
    End Function
    Et en delphi ???

    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Par défaut
    Bon, cette méthode semble fonctionner:



    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    // Note: Ce code est pour du BitMap 24 Bits.
    // Longueur et Largeur sont des constantes prédéfinies
    // et utilisées pour la capture
     
     
    //Types utilisés
    TypeRGB       = Record
                            Bleu, Vert, Rouge : Byte;
                      End;
      TypeTRGBArray = Array [0..Largeur] Of TypeRGB; // Largeur de l'image
      TypePRGBArray = ^TypeTRGBArray;
     
     
     
     
    // Procédure appelée à chaque capture
    function FrameCallBackProc(HndPreview: HWND; lp: PVideoHdr): LongInt;
      stdcall;
    var
      PBitmap: ^Byte;           // Permet de parcourir le lp^.lpData du VideoHDR (l'image)
      Scan : TypePRGBArray;  // Pointeur pour accéder à scanline (qui est en lecture seule)
      var x, y : integer;
        CapturedImage: TBitmap;
    begin
     
       CapturedImage := TBitmap.Create;
       CapturedImage.SetSize(Largeur, Hauteur);
       CapturedImage.PixelFormat := pf24bit;
     
       pBitmap := Pointer(lp^.lpData); // On se place au début de l'image qui contient la liste des valeurs BLEU/VERT/ROUGEµ
       for y := hauteur - 1 downto 0  do begin // Sinon, image inversée
           Scan := CapturedImage.Scanline[y]; //Scan est un pointeur !
           for x := 0 to largeur - 1 do begin
               Scan[x].Bleu := pBitmap^; //En affectant Scan, c'est ScanLine qui est en fait modifié
               inc(pBitmap);
               Scan[x].Vert := pBitmap^;
               inc(pBitmap);
               Scan[x].Rouge := pBitmap^;
               inc(pBitmap);
           end;
       end;
       wc.Image1.Picture.Bitmap := CapturedImage; // Affichage à l'écran... etc.
       CapturedImage.free;
    end;
    Si vous avez des commentaires... je suis preneur.

    Sinfoni.

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

Discussions similaires

  1. Comment passer dans une Bitmap un champs BLOB ?
    Par colorid dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/01/2006, 08h56
  2. [DOS] Boucle FOR : récupérer %%i dans une variable
    Par Pomalaix dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 06/12/2005, 16h18
  3. [SQL] récupérer sélection dans liste déroulante
    Par nerick dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 06/12/2005, 11h30
  4. Récupérer texte dans des variables
    Par Coussati dans le forum Langage
    Réponses: 8
    Dernier message: 12/11/2005, 18h26
  5. [ActionScript] Récupérer variable dans URL
    Par JohnBlatt dans le forum Flash
    Réponses: 2
    Dernier message: 20/07/2005, 10h21

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