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 :

Démarche pour réaliser un logiciel de "capture de page"


Sujet :

API, COM et SDKs Delphi

  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut Démarche pour réaliser un logiciel de "capture de page"
    Bonjour ,

    J'ai vu sur le net un petit programme très très pratique pour réaliser des captures d'écran de façon intégrale.
    Je pense qu'un exemple parlera plus que les mots ... Le programme en question se nomme Web Screen Capture et sur sa page de présentation, il y a une photo on ne peut plus explicite!

    Je me demandais comment réaliser un outil similaire ?
    C'est peut-être simple, mais je ne vois pas trop comment m'y prendre.

    Merci d'avance pour vos réponses
    Ero

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    C'est plus une capture de page qu'une capture d'écran, mais ton libellé est trompeur
    captures d'écran de façon intégrale
    puisque j'avais compris que tu voulais réaliser intégralement le prog

    Il doit y a un webbrowser derrière, mais ensuite, mystère , peut-être une impression vers un fichier ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par qi130 Voir le message
    C'est plus une capture de page qu'une capture d'écran, mais ton libellé est trompeur puisque j'avais compris que tu voulais réaliser intégralement le prog
    J'ai modifié le titre de la discussion.
    Merci

    Citation Envoyé par qi130 Voir le message
    Il doit y a un webbrowser derrière, mais ensuite, mystère , peut-être une impression vers un fichier ?
    Pour le WebBrowser, oui, c'est sûr.
    Quant à l'impression, c'est pas bête! Je n'y avais même pas pensé.

    Je vais voir ça ce soir si je peux.
    Si d'autres ont des idées, qu'ils n'hésitent pas

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    Tu poses simplement un WebBrowser sur ta fiche et depuis OnDocumentComplete, tu appelles cette fonction :

    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
    46
    47
    48
    49
    50
    51
    function SaveWebBrowserToBmp(aWebBrowser :TWebBrowser; aFileName :TFileName) :boolean;
    var
      Doc  :IHTMLDocument2;
      View :IViewObject;
      Rect :TRect;
    begin
      Result := FALSE;
      Doc := aWebBrowser.Document as IHTMLDocument2;
     
      if Assigned(Doc.Body) then
      begin
        //Largeur du WebBrowser à la largeur de l'écran et
        //récupération de la hauteur nécessaire
        aWebBrowser.Width  := Screen.Width;
        aWebBrowser.Height := (Doc.Body as IHTMLElement2).ScrollHeight;
     
        //Masque les ScrollBars
        Doc.Body.Style.Overflow := 'hidden';
     
        with TBitmap.Create do
        try
          Width  := aWebBrowser.Width;
          Height := aWebBrowser.Height;
          Rect := Bounds(0, 0, Width, Height);
     
          //Dessin
          Doc.QueryInterface(IViewObject, View);
          View.Draw(DVASPECT_CONTENT, 1, nil, nil, Application.Handle, Canvas.Handle, @Rect, nil, nil, 0) ;
     
          //Sauvegarde
          SaveToFile(aFileName);
          Result := TRUE;
        finally
          Free;
        end;
      end;
    end;
     
    procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    begin
      SaveWebBrowserToBmp(WebBrowser1, 'c:\temp\Developpez.bmp');
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      URL :OleVariant;
    begin
      URL := 'http://www.developpez.net/forums/f15/environnements-developpement/delphi/';
      webbrowser1.Navigate2(URL);
    end;

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    bonjour,
    pose un "WebBrowser" sur ta form,2 bouton:1 pour lancer la nivigation et le 2 bouton pour faire la capture, Timage et un edit(pour l'adresse web).
    ajoute dans la partie "uses":OleCtrls, SHDocVw_TLB,ActiveX, SHDocVw.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var
      Form1: TForm1;
        b:tbitmap;
    dans l'événement du 1 bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      webBrowser1.navigate(edit1.text);
      b:=TBitmap.Create;
    b.PixelFormat:=pf24bit;
    end;
    ensuite dans du l'événement du 2 bouton(pour la capture):
    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
    procedure TForm1.Button2Click(Sender: TObject);
    var
    ViewObject: IViewObject;
    sourceDrawRect: TRect;
    begin
     if webBrowser1.Document <> nil then
     try
        b.Width:=WebBrowser1.Width;
        b.Height:=WebBrowser1.Height;
        webBrowser1.Document.QueryInterface(IViewObject, ViewObject);
        if ViewObject <> nil then
        try
           sourceDrawRect := Rect(0, 0, b.Width, b.Height);
           ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Self.Handle,
           b.Canvas.Handle, @sourceDrawRect, nil, nil, 0);
        finally
               ViewObject._Release;
        end;
         Image1.Width:=WebBrowser1.Width;//dimensions de WebBrowser1
         Image1.Height:=WebBrowser1.Height;//dimensions de WebBrowser1
         Image1.Picture.Assign(b);
         image1.Refresh;
     except
     end;
     //sauvegarde:
     Image1.Picture.SaveToFile('C:\Image.bmp');
    end;
    A+

    NABIL74
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Ouaaa! J'en demandais pas tant Andnotor !
    Je suis pressé de tester le tout ce soir !!!

    T'es
    Merci !!!

  7. #7
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Super, ça fonctionne niquel!
    Merci

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 732
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 732
    Points : 15 137
    Points
    15 137
    Par défaut
    Salut, ero !

    Citation Envoyé par ero-sennin Voir le message
    Super, ça fonctionne niquel!
    Tu sais quoi ?
    Ça fonctionne vachement mieux en rajoutant MSHTML_TLB, ActiveX dans les uses, sinon ça compile pas avec mon D7,

    Et ça fonctionne encore plus mieux en rajoutant la ligne en rouge, là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        with TBitmap.Create do
        try
          Width  := aWebBrowser.Width;
          Height := aWebBrowser.Height;
          PixelFormat := pf24bit;
          Rect := Bounds(0, 0, Width, Height);
    Pourquoi ?
    Parce qu'avec le code d'origine, le fichier de 27 Mo créé ne peut s'ouvrir avec mon vieux Photoshop 5.5, alors qu'en rajoutant cette ligne, le nouveau fichier de seulement 20 Mo s'ouvre impec !

    Merci donc également à Nabil74,

    Tchô,
    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

  9. #9
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut Jipété,

    Sous D2009, il faut mettre dans les uses ceci :
    OleCtrls, SHDocVw, ActiveX, MSHTML
    Bon, j'ai crié victoire un peu trop vite! Ca fonctionne mais j'ai toujours la ScrollBar verticale ! Comment je peux faire pour la virer ?
    J'ai mis ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aWebBrowser.Width := (Doc.Body as IHTMLElement2).scrollWidth;
    au lieurde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aWebBrowser.Width  := Screen.Width;
    Bon, c'est sur, ça ne change rien
    En ce qui concerne pf24bit (merci Nabil74 ), je l'avais mis, et je suis même passé par un Jpeg
    Dommage, j'atteins presque la perfection...

    Merci d'avance,
    Ero

    PS: Surtout, il faut mettre le WebBrowser à AlNone avant de faire quoi que ce soit, sinon, le redimensionnement ne se fera pas

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 732
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 732
    Points : 15 137
    Points
    15 137
    Par défaut
    Yop !
    Citation Envoyé par ero-sennin Voir le message
    PS: Surtout, il faut mettre le WebBrowser à AlNone avant de faire quoi que ce soit, sinon, le redimensionnement ne se fera pas
    + 1 !
    Je l'ai remarqué également, mais trop tard pour poster (comptais le faire aujourd'hui). Ai remarqué surtout que sur un texte affiché en plusieurs lignes avec Firefox, le même texte se retrouve sur une seule looooooongue ligne dans le WebBrowser, et donc dans l'image.
    Me demande si ces pbs ne viendraient pas du TWebBrowser lui-même... Faudrait essayer avec les composants Indy et ICS, mais j'peux pas, suis au taf sans Delphi handy,
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    Le problème est le codage de la page HTML . J'avais aussi remarqué que les scrollBars restaient visibles sur certaines pages.
    Pour palier à ce problème et plutôt que d'essayer de les masquer par le Body, il suffit de toujours l'afficher (c'est le cas par défaut) et copier l'image moins sa largeur.

    Le ScrollWidth, j'avais essayé aussi , mais logiquement, du texte au kilomètre s'affichera sur une ligne, d'où la limitation à la largeur d'écran. (Le but étant aussi d'avoir un rendu exacte par rapport à l'écran)

    Quant au pf24bit, tu auras le même problème si la hauteur de l'image augmente de 30%. Ma fois si tu manques de ressource, là je peux rien y faire . (Je l'avais rajouté lorsque je me suis retrouvé avec une image de 19'000 pixels de haut).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        with TBitmap.Create do
        try
          PixelFormat := pf24bit;
          Width       := aWebBrowser.Width -GetSystemMetrics(SM_CXVSCROLL);
          Height      := aWebBrowser.Height;
          Rect        := aWebBrowser.ClientRect;
          ...

  12. #12
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Hello ,

    Citation Envoyé par Jipété Voir le message
    Yop !

    + 1 !
    Je l'ai remarqué également, mais trop tard pour poster (comptais le faire aujourd'hui). Ai remarqué surtout que sur un texte affiché en plusieurs lignes avec Firefox, le même texte se retrouve sur une seule looooooongue ligne dans le WebBrowser, et donc dans l'image.
    Me demande si ces pbs ne viendraient pas du TWebBrowser lui-même... Faudrait essayer avec les composants Indy et ICS, mais j'peux pas, suis au taf sans Delphi handy,
    Ah... C'est con, on n'est pas loin de la chose. Moi j'ai pas Delphi avant lundi (peut-être que je pourrai un peu ce soir, mais pas sur).
    Après, le top, ça serait d'intégrer aussi le contenu d'un composant en plus car actuellement j'ai ceci :
    - Un Panel en alBottom pour mes commandes (Capturer - Rafraîchir - Fermer)
    - Un Panel en AlRight qui contient une TreeView. Lors d'un clic sur une treeview, je change l'url du WebBrowser.
    - Un WebBrowser qui m'indique la page selon le noeud sélectionné dans la TreeView.

    L'idéal dans ma capture ça serait que l'on ai la TreeView (Noeud en surbrillance pour indiquer lequel est sélectionné, ça je pense savoir faire) + mon WebBrowser qui contient le contenu de la page chargée selon le noeud. Ca doit être possible, mais faudra surement passer par de la "fusion" d'image ...

    Faut que j'y réfléchisse
    Merci

  13. #13
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut

    Citation Envoyé par Andnotor Voir le message
    Le problème est le codage de la page HTML . J'avais aussi remarqué que les scrollBars restaient visibles sur certaines pages.
    Pour palier à ce problème et plutôt que d'essayer de les masquer par le Body, il suffit de toujours l'afficher (c'est le cas par défaut) et copier l'image moins sa largeur.

    Le ScrollWidth, j'avais essayé aussi , mais logiquement, du texte au kilomètre s'affichera sur une ligne, d'où la limitation à la largeur d'écran. (Le but étant aussi d'avoir un rendu exacte par rapport à l'écran)

    Quant au pf24bit, tu auras le même problème si la hauteur de l'image augmente de 30%. Ma fois si tu manques de ressource, là je peux rien y faire . (Je l'avais rajouté lorsque je me suis retrouvé avec une image de 19'000 pixels de haut).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        with TBitmap.Create do
        try
          PixelFormat := pf24bit;
          Width       := aWebBrowser.Width -GetSystemMetrics(SM_CXVSCROLL);
          Height      := aWebBrowser.Height;
          Rect        := aWebBrowser.ClientRect;
          ...
    Oui, je suis passé aussi par la réduction de la capture Je pensais que l'on pourrait faire plus propre, mais bon, c'est pas plus mal comme ça en fait!

  14. #14
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Voilà, je reviens vers vous pour vous dire que la méthode que propose Andnotor me satisfait. Par ailleurs, j'ai réussi à faire ma capture d'écran de ma TreeView mais je ne récupère que la partie visible à l'écran.
    Je vais donc chercher un peu pour voir si je peux prendre tout le contenu sans les ScrollBars, un peu comme avec le WebBrowser.

    Merci pour votre aide et vos conseils!
    Pour cette discussion, je considère comme résolue
    Ero

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/12/2012, 11h58
  2. Réponses: 3
    Dernier message: 16/10/2012, 16h46
  3. [Présentation] cherche un logiciel pour réaliser un bel exposé
    Par laila morad dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 10/06/2007, 12h33
  4. Recherche 1 logiciel pour réaliser MCD..
    Par User dans le forum Outils
    Réponses: 4
    Dernier message: 26/03/2007, 10h14
  5. Réponses: 4
    Dernier message: 30/05/2006, 00h19

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