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
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
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;