Avatar billede justincase1089 Nybegynder
21. maj 2004 - 06:51 Der er 10 kommentarer og
1 løsning

Hidden TWebBrowser 2 bmp

Hejsa

Her er en ret simpel ting, som jeg indtil nu har brugt et par timer på at løse.

Jeg vil gerne gemme indholdet af en webside som et billede. Billedformatet er ligegyldigt, det drejer sig bare om at få det over i et TBitmap eller tilsvarende.

Dette skal ske i en com objekt hvor der ikke er synlige forms.

Jeg har kigget lidt på GetFormImage, men det virker ikke som om den metode kan finde ud af det med mindre formen er synlig.

Jeg har kigget lidt på WM_PAINT, men tror ikke jeg bruger den rigtig, med mindre det selvfølgelig heller ikke er den rigtige vej.

Jeg har kigget på Webbrowser.PaintTo, men synes heller ikke, at kunne få noget fornuftigt resultat ud af det.

Jeg håber der er en wizzkid der har en måde at gøre det på, eller i det mindste en forklaring på, hvorfor det ikke kan lade sig gøre.

Det skal lige siges, at com objektet skal indgå på serversiden af en hjemmeside, hvorfor en eventuel form slet ikke bliver vist selvom man shower den.

Jeg vil vædde 200 point på, at det ikke kan lade sig gøre ;-)

MVH
  Justin Case
Avatar billede stone Forsker
21. maj 2004 - 08:19 #1
Avatar billede justincase1089 Nybegynder
21. maj 2004 - 08:48 #2
Barsk ... virkelig barsk :-) ... giv mig lige et svar
Avatar billede stone Forsker
21. maj 2004 - 14:42 #3
svar..
Avatar billede hrc Mester
21. maj 2004 - 19:47 #4
Det var rigtignok pænt ramt, stone.

Hvorfor mon programmøren bruger boolean(0) og boolean(1) i stedet for false og true? Er det mon en farisær der ikke programmerer i Delphi til daglig ;-)
Avatar billede justincase1089 Nybegynder
21. maj 2004 - 20:32 #5
Ja, det var ret pænt ramt
Avatar billede stone Forsker
21. maj 2004 - 20:34 #6
gg....
Avatar billede stone Forsker
21. maj 2004 - 20:40 #7
tror mere han er til c++ han er i vokse alderen..
Avatar billede justincase1089 Nybegynder
23. maj 2004 - 01:07 #8
Hmm ... så tæt på, og så alligevel så langt fra. Jeg har brugt omkring 8 timer på at bygge en ASP side der skulle anvende mit COM objekt til at generere thumbnails af websider, men som jeg skriver i mit spørgsmål kan ingen dialoger/forms vises når man anvender COM objekter i web applikationer. Problemet er, at sourcekoden som du (stone) henviser til kræver, at formen hvorpå webbrowseren vises er visible for at webbrowseren gør det den skal, ellers får jeg bare et tomt jpg billede. Jeg håber der er en eller anden der ved, hvordan jeg kan løse problemet ellers er det total nedtur.

Jeg har inkluderet den kode jeg anvender til det. Den ser mere eller mindre ud som den kode der er på swiss..., men jeg har pakket det lidt anderledes ind til mit formål. I projektet har jeg en FormShot med webbrowseren på. Jeg har markeret den linie som gør hele forskellen. Hvis den er der tages der et screen, men COM objektet kan ikke køre på webserveren. Hvis den ikke er der er billedet delvist tomt (jeg har forsøgt med en side med et stort billede på hvor billedet mangler men scrollbarene er der godt nok) til gengæld kan den køre på webserveren.

procedure TDSSWebScreenShot.GenerateScreenShot(const URL, OutputFile: WideString; OriginalWidth, OriginalHeight, ResultWidth, ResultHeight: Integer);
var
  IDoc1: IHTMLDocument2;
  Web: IWebBrowser2;
  V: OleVariant;
begin
  Application.CreateForm(TFormShot, FormShot);
  FormShot.Height := OriginalHeight;
  FormShot.Width := OriginalWidth;

  V := URL;
  FormShot.WebBrowser.Navigate(V);

  FormShot.Show;  <--------------------- Her er den magiske linie
  repeat
    Application.ProcessMessages;
  until not FormShot.WebBrowser.Busy;

  FormShot.WebBrowser.Document.QueryInterface(IHTMLDocument2, iDoc1);
  Web := FormShot.WebBrowser.ControlInterface;
  TControl(FormShot.WebBrowser).Visible := False;
  FormShot.WebBrowser.Height := OriginalHeight;
  FormShot.WebBrowser.Width := OriginalWidth;
  GenerateJPEGfromBrowser(Web, OutputFile, OriginalHeight, OriginalWidth, ResultHeight, ResultWidth);
  TControl(FormShot.WebBrowser).Visible := True;
end;

procedure TDSSWebScreenShot.GenerateJPEGfromBrowser(browser: iWebBrowser2; jpegFQFilename: string;
  srcHeight: Integer; srcWidth: Integer; tarHeight: Integer; tarWidth: Integer);
var
  sourceDrawRect: TRect;
  targetDrawRect: TRect;
  sourceBitmap: TBitmap;
  targetBitmap: TBitmap;
  jpeg: TJPEGImage;
  viewObject: IViewObject;
begin
  sourceBitmap := TBitmap.Create;
  targetBitmap := TBitmap.Create;
  jpeg := TJPEGImage.Create;
  try
    try

      sourceDrawRect := Rect(0, 0, srcWidth, srcHeight);
      sourceBitmap.Width  := srcWidth;
      sourceBitmap.Height := srcHeight;

      viewObject := browser as IViewObject;

      if viewObject = nil then
        Exit;

      OleCheck(viewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, FormShot.Handle,
        sourceBitmap.Canvas.Handle, @sourceDrawRect, nil, nil, 0));

      // Resize the src bitmap to the target bitmap
      targetDrawRect := Rect(0, 0, tarWidth, tarHeight);
      targetBitmap.Height := tarHeight;
      targetBitmap.Width  := tarWidth;
      targetBitmap.Canvas.StretchDraw(targetDrawRect, sourceBitmap);

      // Create a JPEG from the Bitmap and save it
      jpeg.Assign(targetBitmap);

      jpeg.SaveToFile(jpegFQFilename);
    finally
      jpeg.Free;
      sourceBitmap.Free;
      targetBitmap.Free;
    end;
  except
    // Error Code
  end;
end;

MVH
  Justin Case
Avatar billede hrc Mester
23. maj 2004 - 07:43 #9
Hvad med at sætte ShotForm.Parent := nil? Så genereres skærmbilledet, men den har ikke noget sted at sende det. Det kan give lidt flimmer og er måske ikke den rigtige måde.

Det her er hvad jeg har gjort

type
  TfrmInvisible = class(TForm)
    pInvisible: TPanel;
  private
  public
    constructor Create(aOwner : TComponent); reintroduce;
  end;

var
  frmInvisible: TfrmInvisible;

implementation

{$R *.dfm}

{ TfrmInvisible }

constructor TfrmInvisible.Create(aOwner: TComponent);
begin
  inherited Create(aOwner);
  self.Parent := nil;
end;
Avatar billede justincase1089 Nybegynder
23. maj 2004 - 08:09 #10
Nej, det giver samme resultat. Det virker ikke som om ovenstående har effekt hverken når jeg shower formen eller lader være.
Avatar billede justincase1089 Nybegynder
26. november 2005 - 19:56 #11
æv
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester