9

ユーザーに表示されないものを含む UIWebView のコンテンツをキャプチャしようとしています。つまり、ユーザーが上部のみを見ている場合でも、Web ページ全体です。

周りを見回すと、UIView をキャプチャする最良の方法は、レイヤーを取得して renderInContext を使用することであることがわかりました。

ただし、UIWebView は独自の CALayer 実装を使用しているように見えますが、これは CATiledLayer のように動作しますが、標準の CALayer であると主張しています。renderInContext を呼び出すと、ページ全体ではなく、最大 940 ピクセルの Web ページの一部のみが取得されます。

UIWebView を別の 940 ピクセル下にスクロールするように強制する (明らかに理想とはほど遠い) か、WebView をサポートしている CALayer の種類を伝えて、要求したときにすべてのコンテンツをレンダリングする方法について、誰かアイデアを持っていますか?

乾杯

編集:現在、webview のフレームを、javascript で取得したページのサイズに合わせて変更することを追加する必要があります。

4

6 に答える 6

9

それを行うアプリ(Web2Pic )をリリースしました。UIGraphicsBeginImageContext (webView.frame.size);を信頼してください。 UIWebViewの表示領域から小さな画像を取得する以外に何もできません;-(

正しい方法は少し複雑ですが、うまくいきます。

1. UIWebViewでJavaScriptを使用して、これらのfloat値を取得します。

   //Whole page size in HTML coordinate
   document.body.scrollWidth
   document.body.scrollHeight
   //UIWebView visible size in HTML coordinate
   window.innerWidth
   window.innerHeight

2.これで、ページ全体を数十のUIWebViewサイズの小さな断片に「カット」できます。次に、すべての小さなピースを個別にキャプチャして、キャッシュに保存できます。ページオフセットを計算し、UIGraphicsBeginImageContext(webView.frame.size);を使用してこれを実装しました。画像の配列を取得します。さらに、画像配列をファイルシステムにキャッシュする必要があります。そうしないと、アプリが最終的にクラッシュします。

3.最終的にすべての小さなピースを取得したら、フル解像度のコンテキストを開始できます。UIGraphicsBeginImageContext(CGSizeMake(document.body.scrollWidth、document.body.scrollHeight));

4.座標に基づいて、すべての小さな画像を大きなコンテキストにレンダリングします。また、隅に注意してください。すべての行/行の最後の画像が完全な画像ではない場合があります。

5.まだ1つのステップが残っています:大きな画像を保存します。iOSはアルバム内の画像の解像度を自動的に下げるため、PhotoAlbumに保存しないでください。代わりに、それをファイルシステムに保存して、アプリのiTunesファイル共有サポートを有効にしたり、単純なアプリ内フォトマネージャーを作成したりすることもできます。

これらがお役に立てば幸いです;-)

Yichao Peak Ji

于 2011-08-05T02:07:09.277 に答える
2

の高さを のと等しくwebview設定します。contentsizescrollviewwebview

-(UIImage *)captureImage:(UIWebView *)webvw
{
    webvw.frame=CGRectMake(webvw.frame.origin.x, webvw.frame.origin.y, webvw.frame.size.width, webvw.scrollView.contentSize.height);
    UIGraphicsBeginImageContextWithOptions(webvw.frame.size, NO, 0.0f);
    [webvw.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    return screenshot;
}
于 2013-08-07T12:42:26.417 に答える
1

私の質問の1つに答えるために、javascriptを使用してビューをスクロールできます。

したがってstringByEvaluatingJavaScriptFromString:、のjavascriptで使用しますwindow.scrollTo(0,%i);。ここで、%iはスクロール先です。scrollY現在のスクロール値を取得するために使用することもできます。

于 2009-01-23T09:52:08.703 に答える
1

Webviewのサイズを変更することは、私が解決した方法です。より詳細な大きな画像が必要な場合は、このメソッドを呼び出す前にズームインするだけです。大きな次元はパフォーマンスに影響を与える可能性があることに注意してください。

- (UIImage*) imageFromWebview:(UIWebView*) webview{

//store the original framesize to put it back after the snapshot
CGRect originalFrame = webview.frame;

//get the width and height of webpage using js (you might need to use another call, this doesn't work always)
int webViewHeight = [[webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] integerValue];
int webViewWidth = [[webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollWidth;"] integerValue];

//set the webview's frames to match the size of the page
[webview setFrame:CGRectMake(0, 0, webViewWidth, webViewHeight)];

//make the snapshot
UIGraphicsBeginImageContextWithOptions(webview.frame.size, false, 0.0);
[webview.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

//set the webview's frame to the original size
[webview setFrame:originalFrame];

//and VOILA :)
return image;

}

于 2014-02-19T15:56:47.983 に答える
1

UIWebView はオンデマンドでレンダリングされるように見えます (大きなページで急速に下にスクロールすると、チェッカーボードが表示されます)。そのため、ユーザーが下にスクロールするまで、到達できるレイヤーの下の部分には何もありません。レイヤーは持っていないものを書き出すことができないので、エリア全体をキャプチャすることはできないと思います.

スクロールに関しては、下に移動するために考えられる明らかな公開された API メソッドはありません。Web ビューは UIScrollView などをホストしているようで、ビュー階層をトラバースしてその scrollRectToVisible:animated: を使用することでアクセスを試みることができますが、それは長期的な解決策のようには思えません。

于 2009-01-22T22:59:26.633 に答える
0

すべてのUIViewには1024x1024のサイズ制限があるため、プログラムでスクロールし、ページをチャンクにキャプチャして、何らかの方法でそれらをつなぎ合わせる必要があります。

于 2009-02-04T10:07:55.127 に答える