Mega Code Archive

 
Categories / Delphi / Files
 

Web Page to Image File

Title: Web Page to Image File Question: It was asked how one might save a webpage to disk as a image file from IE. I did not see an obvious way to do with with IE below is a way to get the URL from IE and then open it with PBear's THTMLViewer and save it as a image file. Answer: Note: This is written in Delphi 5 but with a little modification, most if not all of it could be used in Delphi 3 or higher, Kylix and maybe C++Builder. First of all, you need Dave Baldwin's PBear THTMLView or THTMLLite. It is available here: http://www.pbear.com/htmlviewers.html Get the Indy demo application since it supports actually downloading web pages and images from the web via http. Open up the Demo application and add two buttons to the tool bar. The caption on the first is "DDE URL" and the second is "As Image". For the click event of the "DDE URL" button should look like this: procedure THTTPForm.btnDDEURLClick(Sender: TObject); begin UrlComboBox.Text := GetDDEUrl; // get the URL GetButtonClick(nil); // Navigate to the URL end; GetDDEUrl calls the following function which you will need to above the method: // using DDE gets the URL from the active browser function GetDDEUrl: string; function GetUrl(sService: string):string; var Dde: TDdeClientConv; begin Dde := TDdeClientConv.Create(nil); try Dde.ConnectMode := ddeManual; Dde.SetLink(sService, 'WWW_GetWindowInfo'); If Dde.OpenLink Then try Result := string(Dde.RequestData('0xFFFFFFFF')); if Length(Result)0 then begin // trim up the results Delete(Result,1,1); Delete(Result,Pos('",',Result),Length(Result)); end; finally Dde.CloseLink; end; finally dde.Free; end; end; begin // try a few browsers until we get one Result := GetUrl('Netscape'); if Result = '' then Result := GetUrl('IExplore'); if Result = '' then Result := GetUrl('Opera'); if Result = '' then Result := GetUrl('Mosaic'); end; The click event of the As Image button should look like this: procedure THTTPForm.btnSaveImageClick(Sender: TObject); Var img: TBitmap; {$IFDEF GIF} gif: TGifImage; {$ENDIF} Jpg: TJPEGImage; ext: string; begin if SavePictureDialog.Execute then begin Img := TBitmap.Create; try img.Height := FrameBrowser.ClientHeight; img.Width := FrameBrowser.ClientWidth; img.Canvas.Brush := FrameBrowser.Brush; img.Canvas.FillRect(FrameBrowser.ClientRect); img.Canvas.Lock; FrameBrowser.PaintTo(img.Canvas.Handle,0,0); img.Canvas.Unlock; ext := UpperCase(ExtractFileExt(SavePictureDialog.FileName)); if SameText(ext,'.JPEG') or SameText(ext,'.JPG') then begin Jpg := TJPEGImage.Create; try Jpg.CompressionQuality := 100; Jpg.Assign(img); Jpg.SaveToFile(SavePictureDialog.FileName); finally Jpg.Free; end; end else {$IFDEF GIF} if SameText(ext,'.GIF') then begin gif := TGIFImage.Create; try gif.Assign(img); gif.SaveToFile(SavePictureDialog.FileName); finally gif.Free; end; end else {$endIF} img.SaveToFile(SavePictureDialog.FileName); finally img.free; end; end; end; You will need to add "Jpeg, DDEMan, RXGif" to the uses clause of the unit you are in. If you don't have RXLib ( http://einstein.fet.uni-hannover.de/~od/rxlib/ ) then you will need to use some other GIF library. If you don't have a Gif library then add the line {$UNDEF GIF} at the top of the unit. If you do have a gif library then add the line {$DEFINE GIF} at the top of the unit. You will also need to add a TSavePictureDialog named SavePictureDialog. Set the DefaultExt property to .JPEG or .BMP. You may also want to clean up the filter to only show supported image formats. Now run your program. Click the "DDE URL" button and it will navigate to the page currently open in your active browser. Then resize the page for maximum efficency and click "As Image" then name the image and save it. You could modify this to have no user interaction if you like. -Jim McKeeth