ホームページ ウェブフロントエンド jsチュートリアル IE11 での Canvas.toDataURL を使用した互換性問題の解決策

IE11 での Canvas.toDataURL を使用した互換性問題の解決策

Apr 14, 2018 pm 02:12 PM
ie11

今回は、IE11 で Canvas.toDataURL を使用する際の互換性の問題を解決するためのアイデアをお届けします。 。

問題が見つかりました 最近、プロジェクトでは Canvas の toDataURL メソッドを使用して、

画像

の Base64 形式データを取得し、バックグラウンドにアップロードするために使用できます。以前、キャンバスがクロスドメイン画像によって汚染され、データを取得できなくなるという落とし穴に遭遇したことがあったので、最初から CrossOrigin 属性 の値を巧みに追加しました。 コードはおおよそ次のとおりです。 これは確実だと思いましたし、Chrome ブラウザでは非常にスムーズに進みましたが、IE11 では不可解な SecurityError が発生しました:

特定のエラー メッセージはありません。プロンプトには toDataURL を実行する行が表示されるだけですが、これは非常にわかりにくいです。

IE11 での Canvas.toDataURL を使用した互換性問題の解決策

試してみる

初めてグーグルで検索したところ、多くの人がこの問題に遭遇していることがわかりましたが、有効な解決策は見つかりませんでした。 Fabric.js の使用を提案する人もいましたが、調べてみると面倒だと思いました。 caniuse では、この方法が IE11 では問題があることも明確にマークされています。 IE のバグのようだったので、国を保存する方法を考えました。画像の Base64 データを取得する方法は 1 つだけではありません。toDataURL メソッドは十分にサポートされていないため、別の方法を使用します。

まずキャンバスを BLOB に変換します

  • 次に、FileReader を使用して dataUrl を読み取ります

  • コードはおおよそ次のとおりです:

    const canvas = document.createElement("canvas");
    const context = canvas.getContext("2d");
    context.fillStyle = "black";
    context.fillRect(0, 0, canvas.width, canvas.height);
    const imageElement = document.createElement("img");
    imageElement.crossOrigin = "Anonymous";
    imageElement.onload = () => {
     context.drawImage(
     imageElement,
     params.left,
     params.top,
     canvas.width,
     canvas.height,
     0,
     0,
     canvas.width,
     canvas.height
     );
     const dataUrl = canvas.toDataURL("image/jpeg", 1);
    }
    imageElement.src = 'xxx';
    ログイン後にコピー
    しかし、これでは役に立ちません....
今回は、msToBlob メソッドが SecurityError を報告する番でした。私:? ? ?

解決しました

実際にはセキュリティ上の理由があるようです。唯一のセキュリティ上の理由は、クロスドメイン イメージです。 IEのセキュリティポリシーが厳しくなっているのかもしれないし、を設定してもデータの読み込みはできないのではないかと思い、クロスドメインなのでクロスドメインを外してみようと考えました。要因:

ajax を使用して画像のバイナリデータの取得をリクエストします crossOrigin = "Anonymous"

  • バイナリデータをbase64形式に変換します

  • 取得したbase64データをimage要素のsrcとして設定し、キャンバスに描画します

  • 通常通り toDataURL を呼び出します

  • コードはおおよそ次のとおりです:

const reader = new FileReader();
reader.readAsDataURL(canvas.msToBlob());
reader.onloadend = () => {
 const base64data = reader.result;
};
ログイン後にコピー
試してみたところ、無事に目標を達成できました。

後で情報を確認したところ、キャンバスが汚染されている場合、toDataURL も toBlob も正常に実行されないことがわかりました。

欠陥

この方法でも目標は達成できますが、パフォーマンスが犠牲になります。最初に画像データをリクエストする必要があるだけでなく、データ エンコーディングの変換にも非常に時間がかかります。小さな写真は問題ありませんが、写真が大きい場合 (たとえば、3M を超える場合)、プロセス全体に最大 1 ~ 2 分かかる可能性があり、これは許容できません。

キャンバスの toDataUrl は画像を圧縮しますか?

Canvas のdrawImage メソッドを使用して画像オブジェクトをキャンバス上に描画すると、画像サイズが大幅に増加するため、PNG 形式でのみ保存できます。 toDataUrl を使用して Canvas を Base64 に変換します。encoderOptions を 1 に設定しても、画像は大幅に縮小されますが、それでも元の画像よりは大きくなります。 encoderOptions がデフォルトの 0.92 を使用する場合、最終的な画像サイズは初期のものと同様になります

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、PHP に関する他の関連記事に注目してください。中国語のサイトです!

推奨読書:

Angular4の入出力の使い方

easyuiのドロップダウンボックスの動的カスケードロードの実装方法(コード付き)

以上がIE11 での Canvas.toDataURL を使用した互換性問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? 独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? Mar 18, 2025 pm 03:12 PM

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? Mar 18, 2025 pm 03:14 PM

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:16 PM

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

ソースマップを使用して、マイナイドJavaScriptコードをデバッグするにはどうすればよいですか? ソースマップを使用して、マイナイドJavaScriptコードをデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:17 PM

この記事では、ソースマップを使用して、元のコードにマッピングすることにより、Minified JavaScriptをデバッグする方法について説明します。ソースマップの有効化、ブレークポイントの設定、Chrome DevtoolsやWebpackなどのツールの使用について説明します。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

初心者向けのタイプスクリプト、パート2:基本データ型 初心者向けのタイプスクリプト、パート2:基本データ型 Mar 19, 2025 am 09:10 AM

エントリーレベルのタイプスクリプトチュートリアルをマスターしたら、TypeScriptをサポートするIDEで独自のコードを作成し、JavaScriptにコンパイルできるはずです。このチュートリアルは、TypeScriptのさまざまなデータ型に飛び込みます。 JavaScriptには、NULL、未定義、ブール値、数字、文字列、シンボル(ES6によって導入)とオブジェクトの7つのデータ型があります。 TypeScriptはこれに基づいてより多くのタイプを定義し、このチュートリアルではすべてを詳細に説明します。 ヌルデータ型 JavaScriptのように、Typescriptのnull

See all articles