1. ホーム
  2. javascript

[解決済み] JavaScriptで画像データのURLを取得する?

2022-03-15 03:31:14

質問

通常のHTMLページで、いくつかの画像(単に通常の <img /> HTMLタグ)。できれば、画像を再ダウンロードすることなく、その内容をbase64でエンコードして取得したいのです(つまり、すでにブラウザで読み込まれているので、今度は内容が欲しいのです)。

GreasemonkeyとFirefoxで実現したいですね。

どのように解決するのですか?

注意事項 これは、画像がページと同じドメインのものである場合、または画像に crossOrigin="anonymous" 属性があり、サーバーがCORSをサポートしている場合。また、元のファイルは得られませんが、再エンコードされたバージョンは得られます。元のファイルと同じ結果を得る必要がある場合は、以下を参照してください。 海堂の回答 .


正しい寸法の canvas 要素を作成し、画像データを drawImage 関数を使用します。次に toDataURL 関数を使用して、Base-64 エンコードされた画像を持つ data: url を取得します。画像は完全に読み込まれている必要があり、そうでない場合は空の(黒くて透明な)画像が返されるだけであることに注意してください。

こんな感じでしょうか。Greasemonkeyのスクリプトは書いたことがないので、その環境で動作するようにコードを調整する必要があるかもしれません。

function getBase64Image(img) {
    // Create an empty canvas element
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;

    // Copy the image contents to the canvas
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);

    // Get the data-URL formatted image
    // Firefox supports PNG and JPEG. You could check img.src to
    // guess the original format, but be aware the using "image/jpg"
    // will re-encode the image.
    var dataURL = canvas.toDataURL("image/png");

    return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}

JPEG形式の画像を取得するのは、古いバージョン(3.5あたり)のFirefoxではうまくいかないので、対応したい場合は互換性を確認する必要があります。エンコーディングに対応していない場合は、デフォルトで "image/png" になります。