N種類のキャンバスエクスポートイメージのクロスドメインポーズサマリーのロックを解除する
この記事では、ドメインをまたいだキャンバス書き出し画像のロックを解除するためのN個のポジションを、以下のように共有してまとめています。
<ブロッククオートUncaught DOMException: HTMLCanvasElement' で 'toDataURL' の実行に失敗しました。汚染されたキャンバスはエクスポートされない可能性があります。
上記のエラーは、セキュリティポリシーでクロスドメインでの画像のエクスポートが許可されていないため、現在とは異なる画像サーバーのドメインに画像をエクスポートする際に、canvasを使ってtoDataUrlを実行すると、誰もが遭遇すると思われるものです
このクロスオーバーの問題を解決するには、いくつかの方法があります。
I. 画像をbase64に変換する
画像をbase64に変換すると、ドメイン名がなくなるので、当然クロスドメインは発生しません。
注:画像はbase64に変換プラス画像ファイルのサイズを増加させる、画像が比較的大きい場合、それはbase64に変換することは推奨されません、それ以外の場合は、サイトの速度に影響を与え、ページのロード時間を増加させます、このアプローチは、一般的に小さな画像に適用されます。
第二に、画像サーバーの設定でクロスドメインが可能であること
つまり、画像をリクエストした際に返されるレスポンスヘッダに
Access-Control-Allow-Origin
の値 (すべてのウェブサイトからのクロスドメインリクエストを許可する) または現在のウェブサイトのドメイン (固定ドメインからのクロスドメインリクエストのみを許可する) を指定すると、フロントエンドに画像のクロスドメイン属性が読み込まれるようになります。
img.crossOrigin="anonymous".
具体的なコードは以下の通りです。
var canvas = document.getElementById('myCanvas')
var ctx = canvas.getContext('2d')
var img = document.createElement('img')
img.crossOrigin = "anonymous"
img.src = 'https://p4-q.mafengwo.net/s12/M00/CA/3B/wKgED1w8fL6ADk16AAXyDaz2bdU61.jpeg'
img.onload = function() {
ctx.drawImage(img,0,0,500,300);
console.log(canvas.toDataURL())
}
これにより、ビフォーアフター・クロスドメインの問題が解決されます
III. 現在のドメインの下に画像を置く
不謹慎な笑いをお許しください、これは確かに問題を解決する方法です。
しかし、実際のプロジェクトでは、画像は通常cdnに保存されているので、この方法はあまり現実的ではありません?
画像がbase64になれば、ドメイン名がなくなるので、当然クロスドメインは発生しません。
四、画像サービスがクロスドメインレスポンスヘッダを設定できない場合
例えば、WeChatのアバターのようなサードパーティのウェブサイトからアバターを取得し、フロントエンドで新しい画像を動的に生成するが、WeChatのアバター画像はクロスドメイン・エクスポートを許可しないといった状況が実際に存在します。上記のどの方法もうまくいきません
このような状況は、バックエンドの支援を必要とする、バックエンドは、転送の層を行うには、サーバー側は、フロントエンドに戻り、または新しい画像のリンクを生成するために、クロスドメインを許可するローカルサーバーに格納されてアバターを取得するには、方法1または方法2、フロントエンドに戻り、この時間と組み合わせて、クロスドメインの問題も自然に解決されています。
あなたが画像をエクスポートするためにhtmlToCanvasプラグインを使用する場合は、useCORSを追加する必要があります:真の構成項目は、原理は方法2と同じですが、前提条件は、画像ドメインがクロスドメインを許可していることです。
私が知っているN個の方法はこれで終わりですが、もっと追加してください。
今回書いたのは以上です。あなたの勉強のお役に立てれば幸いです。そして、スクリプトハウスを応援していただければ幸いです。
関連
-
html5呼び出しカメラサンプルコード
-
HTML5でWeChatの共有を呼び起こす外部ブラウザ
-
キャンバス版体内時計の実装例
-
AmazeUI モバイルページ トップナビゲーションバー ヘッダーとサイドナビゲーションバー offCanvas サンプルコード
-
ビデオカバーを設定するH5ビデオポスタープロパティ
-
キャンバスのマウスがアニメーションの背景に従うことを達成するために5分
-
HD画面でのキャンバスサイズリセットによる不具合の解消について
-
キャンバスラバーバンド線引き塗布方法
-
モバイルウェブの画像プリロード方式について簡単に紹介します。
-
ビデオグリーンスクリーンキーイングのキャンバスピクセルポイントマニピュレーション
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
html+cssでメニューバーのスロードロップダウン効果を実現するコード例
-
AmazeUIがモーダルボックスにフォームを埋め込んでモーダルインプットボックスを形成する
-
htmlページでsessionの値を取得する方法
-
キャンバスで画像のミラーリングと反転を実現する2つの方法
-
Html5 Streamを用いたリアルタイムモニタリングシステムの開発
-
HTMLのテキスト属性とカラーコントロール属性の実装
-
キャンバスを使った線形・放射状グラデーションの使用例
-
html5 目覚ましアプリミニノート
-
html2canvas.jsを使用してページのスクリーンショットを撮影し、表示またはアップロードするサンプルコード
-
HTML5ページシームレス点滅オープン問題と解決策