ブラウザウィンドウのスクリーンショット機能の実装
4058 ワード
仕事の中で1つの需要に出会う:ページの中で1つのページのフィードバックを提出するボタンを設定して、ユーザーはこのボタンをクリックする時弾き出すdialogの中でフィードバックの内容を記入することができて、記入し終わってクリックして確定して弾窓を閉じる時現在のブラウザのウィンドウの中の内容を捕獲して画像を生成して、ページの中の現在の状態を記録するために、バックグラウンドでは、ユーザーが記入した内容と生成した画像をデータベースに保存して、メンテナンス担当者が表示します.資料を調べて大体の考え方をいくつか分けます.
1、javaのRobotクラスを使用して、実現過程は以下の通りである. Robot robot = new Robot(); robot.delay(10000); Dimension d = new Dimension(Toolkit.getDefaultToolkit().getScreenSize()); int width = (int) d.getWidth(); int height = (int) d.getHeight(); //ブラウザの最大化 robot.keyRelease(KeyEvent.VK_F11); robot.delay(2000); Image image = robot.createScreenCapture(new Rectangle(0, 0, width, height)); BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = bi.createGraphics(); g.drawImage(image, 0, 0, width, height, null); //画像を保存 ImageIO.write(bi, "jpg", new File("google.jpg"));
この方式はテスト後javaプロジェクトで現在のデスクトップのスクリーンショットを実現できることが分かったが、Webプロジェクトでrobot.createScreenCaptureに実行するとエラーが報告され、権限の問題に関連しているようだ.また、この方式でスクリーンショットしたのはサーバ側のデスクトップで、否決された疑いはない.
2、javaプログラムでスクリプトを呼び出してサードパーティの.exeスクリーンショットツールを実行することによってスクリーンショットを実現する.この実現方式は同時の問題だけでなく、exeファイルがlinuxシステムの下で正常に呼び出されるかどうかは検証されるためpassである.
3、前の2つの方式はバックグラウンドプログラムから画像を生成する構想に偏っているので、考え方を変えてフロントからjsに頼って画像を生成し、調べた資料の実現方式はdom-to-img、Html 2 Image、html 2 canvasなどを含み、テストを経た前に両者は画像を生成する時にフォーマットが明らかに変化し、明らかに要求を満たすことができないので、第3の方式を採用することを選んだ.html 2 canvasは、dom要素からcanvas要素への変換を実現するフロントエンドプラグインです.公式プロジェクトgithubプロジェクトアドレス:クリックしてリンクを開きます.
このプラグインの使用方法は簡単で、html 2 canvas.jsファイルを導入すれば使用できます.コアメソッドは以下の通りです.
html2canvas(domElement, { option1: *,
option2:*,
......
onrendered: function(canvas){ document.body.appendChild(canvas); },
});
onrendered: function(canvas){ document.body.appendChild(canvas); },
});
注意:
Name
Type
Default
Description
allowTaint
boolean
false
ドメイン間のサポート
background
string
#fff
背景色、既定の透明度
height
number
null
canvas高さ
letterRendering
boolean
false
ワードピッチ
logging
boolean
false
console.log()出力情報
proxy
string
undefined
ドメイン間ピクチャのロード
taintTest
boolean
true
レンダリング前に画像をテストするかどうか
timeout
number
0
ピクチャロード遅延、デフォルト遅延0、ミリ秒単位
width
number
null
canvas幅
useCORS
boolean
false
ドメイン間のサポート
注意:allowTaintとuseCORSはドメイン間に関連する属性ですが、同時にtrueに設定することはできません.そうしないと、エラーが発生します.
私は多くの資料を調べて、allowTaintを使ってドメイン間問題を解決していますが、私のプロジェクトではallowTaintを使ってドメイン間要求を禁止する問題を報告します.useCORSを使って解決することができます.具体的には、私も何が原因なのか分かりません.後でゆっくり研究します.
1、javaのRobotクラスを使用して、実現過程は以下の通りである.
この方式はテスト後javaプロジェクトで現在のデスクトップのスクリーンショットを実現できることが分かったが、Webプロジェクトでrobot.createScreenCaptureに実行するとエラーが報告され、権限の問題に関連しているようだ.また、この方式でスクリーンショットしたのはサーバ側のデスクトップで、否決された疑いはない.
2、javaプログラムでスクリプトを呼び出してサードパーティの.exeスクリーンショットツールを実行することによってスクリーンショットを実現する.この実現方式は同時の問題だけでなく、exeファイルがlinuxシステムの下で正常に呼び出されるかどうかは検証されるためpassである.
3、前の2つの方式はバックグラウンドプログラムから画像を生成する構想に偏っているので、考え方を変えてフロントからjsに頼って画像を生成し、調べた資料の実現方式はdom-to-img、Html 2 Image、html 2 canvasなどを含み、テストを経た前に両者は画像を生成する時にフォーマットが明らかに変化し、明らかに要求を満たすことができないので、第3の方式を採用することを選んだ.html 2 canvasは、dom要素からcanvas要素への変換を実現するフロントエンドプラグインです.公式プロジェクトgithubプロジェクトアドレス:クリックしてリンクを開きます.
このプラグインの使用方法は簡単で、html 2 canvas.jsファイルを導入すれば使用できます.コアメソッドは以下の通りです.
html2canvas(domElement, { option1: *,
option2:*,
......
onrendered: function(canvas){ document.body.appendChild(canvas); },
});
onrendered: function(canvas){ document.body.appendChild(canvas); },
});
vue, package.json , js :
beta , ,alpha , ;
html2canvas, , :
html2canvas(document.body, {
// allowTaint: true,
taintTest: true,
useCORS: true,
async: false,
// proxy: false,
onrendered: function(canvas) {
var data = canvas.toDataURL('image/png');
...
}
注意:
a、 data base64 , ;
b、 , 。 springcloud , @CrossOrign 。
c、 option :
Name
Type
Default
Description
allowTaint
boolean
false
ドメイン間のサポート
background
string
#fff
背景色、既定の透明度
height
number
null
canvas高さ
letterRendering
boolean
false
ワードピッチ
logging
boolean
false
console.log()出力情報
proxy
string
undefined
ドメイン間ピクチャのロード
taintTest
boolean
true
レンダリング前に画像をテストするかどうか
timeout
number
0
ピクチャロード遅延、デフォルト遅延0、ミリ秒単位
width
number
null
canvas幅
useCORS
boolean
false
ドメイン間のサポート
注意:allowTaintとuseCORSはドメイン間に関連する属性ですが、同時にtrueに設定することはできません.そうしないと、エラーが発生します.
私は多くの資料を調べて、allowTaintを使ってドメイン間問題を解決していますが、私のプロジェクトではallowTaintを使ってドメイン間要求を禁止する問題を報告します.useCORSを使って解決することができます.具体的には、私も何が原因なのか分かりません.後でゆっくり研究します.