RECOMMEND
SELECTED ENTRIES
RECENT COMMENTS
  • delphiコンポーネント:祝祭日カレンダーコンポーネント
    pooco (12/26)
  • delphiコンポーネント:祝祭日カレンダーコンポーネント
    hopeseeds (12/26)
  • delphiコンポーネント:祝祭日カレンダーコンポーネント
    pooco (12/26)
  • Delphiコンポーネント:国際化対応コンポーネント IniLang
    hopeseeds (08/22)
  • Delphiコンポーネント:国際化対応コンポーネント IniLang
    Hideo (08/21)
  • 特定のページが開けない!なんと、コードギアのホームページが開けない・・私のせい?
    QQ (07/18)
  • delphiコンポーネント:祝祭日カレンダーコンポーネント
    taha (05/30)
  • delphiコンポーネント:祝祭日カレンダーコンポーネント
    cham (03/27)
  • 第8回 CodeGearデベロッパーキャンプ開催!
    cham (03/27)
  • delphiコンポーネント:祝祭日カレンダーコンポーネント
    ふみちゃん (03/25)
RECENT TRACKBACK
CATEGORIES
ARCHIVES
MOBILE
qrcode
LINKS
PROFILE
OTHERS

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

Delphi Holic (HopeSeeds blog)

「Delphi Holic」は、ホープシーズ製品の紹介、
Delphi、Kylix、Lazarusなどの情報を上げていきます。
<< Delphi コンポーネント紹介 :最適なWEBブラウザは? | main | パソコンが勝手にリブートする >>
WebBrowserに表示されている全てのHTMLの描画イメージを取る
 ブラウザ画面を画像ファイルに変換するツールがある。例えば、html2img など。今表示されている部分をキャプチャーするのは、簡単だけれども、隠れている部分全てを画像にしてしまうのは、ちょっとしたコツがいる。「html2img」 は有料のツールなので、技術を紹介しても良いのか悩むが、枯れた技術だよね・・。

 この技術の大本は、Delphi Tips の 「TWebBrowser を使って HTML の描画イメージを取得する」のページが、そのものである。今回は、これを参考に、前回紹介した、最適なWEBブラウザは? の、
TUIWebBrowser 
Embedded Web Browser
用に変換してみる。

まず、双方とも、
interface
uses
 ・・・  ,MSHTML_TLB,ActiveX;
を追加する。MSHTML_TLB は、TUIWebBrowserなら、付属しているし、わからなければ、Delphi MSHTML_TLB で検索してみよう。
 
 その上で、Delphi Tips のをそのまま、コピーさせてもらうと、下記の様なサブルーチンのソースとなる。そのまま、コピーさせてもらっているから、コメントも同じ。
追加で、test1.bmp として保存している。

それぞれ、WebBrowserコンポーネントを、web という name にしたとする。

procedure TForm1.BmpGetSub();
var
 bmp: TBitmap;
 body: OleVariant;
 w, h: Integer;
begin
 body := (web.Document as IHTMLDocument2).Body;

 bmp := TBitmap.Create;
 try
// 軽くマージンをつけておかないとスクロールバーがついちゃいます。
  bmp.Width := body.scrollWidth + 16;
  bmp.Height := body.scrollHeight + 16;

  (* ここで WindowLock(Web.Handle) すべきでしょうか?
CPU などの性能によってはチラつきそうです。 *)

  // 現在値を保存してリサイズします。
  w := web.ControlInterface.Width;
  h := web.ControlInterface.Height;
  web.ControlInterface.Width := bmp.Width;
  web.ControlInterface.Height := bmp.Height;

  // 描画します。
  OleDraw(web.ControlInterface, DVASPECT_DOCPRINT, bmp.Canvas.Handle,Rect(0, 0, bmp.Width, bmp.Height));

  // 元の大きさに戻します。
  web.ControlInterface.Width := w;
  web.ControlInterface.Height := h;
  
  (* ここで WindowLock() してるなら戻す *)
  (* ここでいろいろ bmp を使って遊べます *)
  bmp.SaveToFile('test.bmp');
 finally
  bmp.Free;
 end;
end;

ここで、あらら・・だったのが、
web.ControllInterface でなく、web.ControlInterface だった。

 このままだと、スクロールバーが見えてしまうので、その処理を施せば良いのだが、例えば、
GetSystemMetrics(SM_CXHSCROLL) で水平スクロールバーの高さを
GetSystemMetrics(SM_CYHSCROLL) で垂直スクロールバーの幅をを差し引けばよい。

 以前、訪れたトップページを片っ端から、キャプチャーして、サムネイル画面から、そのページにジャンプする様なものを開発した時、現在見えている画面をそのままキャプチャーしたところ、タイミングがまずいと、期待した位置でのキャプチャーにならず、訳のわからない画像が取得されてしまう。
例えば、
Embedded Web Browser だと、
EmbeddedWB1.GetBmpFromBrowser('test2.bmp') ;
で一発で、今見えている部分を画像化してくれるが、それよりは、ブラウザ全ての画面を取った上で、最もらしい、上部の一部分をくりぬいた画像をサムネイル画像とした方が、より確実といえる。







| Delphi Holic | 23:39 | comments(0) | trackbacks(0) | - | - |









http://delphiholic.hopeseeds.com/trackback/226874