html2canvasに基づいて、Webページを画像および画像の明瞭さとして保存します
Based Html2canvas Save Web Pages
ソース: https://segmentfault.com/a/1190000011478657?utm_source=tag-newest
この技術研究は、H5プロジェクトの重要な機能要件である実装WeChat long press the web page to save as a screenshot
から導き出されています。
ここに栗があります(WeChatで開き、画像を長押しして保存してください): 3分であなたの知識の境界を探る
Webページ全体を写真として保存することは、H5イベントページの最後に共通する非常に興味深い機能です。以下は、プロジェクトの調査と踏み込みの概要と概要です。
画像リソースのキャンバスが原因でHomologous restriction
キャンバスにクロスドメイン画像リソースが含まれていると、キャンバスが汚染され、生成された画像スタイルまたはhtml2canvasメソッドで混乱が生じます。
次の主な解決策 2種類のクロスドメイン画像リソース :CORS CDN
イメージリソースおよびWeChat user avatar
イメージリソースで構成されたものを含みます。
3.1CDNでの画像の構成
- CDN画像を構成するように依頼します
CORS
。CDN
構成後、応答ヘッダーがchrome開発者ツールに含まれている必要があることがわかります。Access-Control-Allow-Origin
フィールド。 - 開く
html2canvas
ofuseCORS
構成項目 。次のように設定するだけです。
var opts = {useCORS: true} html2canvas(element, opts)
note
:
有効になっていない場合html2canvas
of useCORS
構成項目html2canvas
正常に実行され、エラーは報告されませんが、対応するCDNイメージは出力されません
(両方を含めるようにテスト済みPicture of CDN
with Local picture
リソースページ、ただしLocal picture
正常にレンダリングできる)
3.2WeChatユーザーアバターの設定
必要に応じてWeChat
プラットフォームのユーザーアバターは画像として保存されます。3.1
プログラムは無力です。サーバーProxy forwarding
(フォワード)実装で構成できますが、ここでは繰り返しません。
その他の考慮事項
1.マージンオクルージョンの問題
WeChatで、呼び出しますLong press to save the picture
メニューは、オブジェクトを直接長押しする必要があります要素の上にオクルージョンがある場合、メニューは呼び出されません。
実際、オクルージョンは非要素だけではなく、おそらくmargin
属性です。たとえば、ページの下部で、絶対位置の要素に非常に大きな値が設定されている場合。margin-top
、then margin-top
関係する領域では、通話メニューを押し続けることはできません。解決策:will margin-top
切り替えtop
問題ありません。
2.Android版のWeChatが画像の保存に失敗しました
canvas2img
デフォルトの保存画像形式はpng
ですが、AndroidバージョンのWeChatで生成された画像は、長押ししてメニューを呼び出して画像を保存できますが、 ローカルアルバムに正しく保存できません 。solution
:設定canvas2img
生成された画像形式の構成項目はjpeg
問題ありません。
3.JPEGブラックスクリーンの問題
設定canvas2img
出力形式はjpeg
結果の画像に多数の黒いブロックが含まれる可能性があります。Possible solution
:一部の画像要素のサイズとサイズを縮小します。
4.効果を維持できない
画像Before conversion
で、stop
またはモーションを削除して画像を正しくレンダリングする必要があります。そうしないと、生成された画像が壊れます。