DOM画像処理

【JavaScript】 画像を動的に読み込んでhtml(DOM)やCanvasで使用する

更新日:2020/06/03

今回はURLで指定された画像を読み込むJavaScriptコードを作成してみます。

読み込みエラー時の処理も、しっかりと作りこみます。

 

既存のIMGタグの画像を変更する

HTML上に既にIMGタグがある場合は、srcプロパティを書き換えるだけです。

HTML

<img id="image" src="url">

JavaScript

window.addEventListener('DOMContentLoaded',()=> {
   const img = document.getElementById("image");
   img.src = 新しいURL;
});

srcプロパティにセットした時点で、ブラウザが画像を読み込んでくれます。

imgタグに画像を表示するだけなら、これだけで問題ありません。
しかしCanvas等で使用する場合、画像がブラウザ内に読み込まれるのを待つ必要があります。
読み込み完了やエラーを検知するを見てください。

 

新規でIMG要素を作成

タグを使わずにJavaScript上だけで画像を処理するには、imageオブジェクトを使用します。

JavaScript

window.addEventListener('DOMContentLoaded',()=> {
   const img = new Image( );
   img.src = 新しいURL;
});

imageオブジェクトのsrcプロパティに画像URLをセットした時点で、非同期で画像の読み込みが始まります。

しかし画像の読み込みは時間がかかるため、srcプロパティセット直後は内容が空です。
そのためCanvas等で使用する場合、画像がブラウザ内に読み込まれるのを待つ必要があります。
読み込み完了やエラーを検知するを見てください。

 

読み込み完了やエラーを検知する

読み込み完了や、URL先のファイルが存在しないなどの読み込エラーを検知したい場合、onload と onerrorプロパティにコールバック関数をセットします。

   const img = document.getElementById("image");
   // または
   // const img = new Image( );

   img.onload = function(){  }; // 読み込み完了時に呼び出される関数をセット
   img.onerror = function(){  }; // エラー時に呼び出される関数をセット

    img.src = 新しいURL;

srcをセットした時点で、非同期に画像読み込みが開始します。

そのため、必ずコールバック関数を登録してから、srcを操作します。

 

複数の画像URLを動的に呼び出す関数

今回は複数の画像URLを一度に読み込む関数を作成しました。

複数のURLから動的に画像を読み込むJavaScript

const onloadImage = ( imageUrls , callBack = ()=>null , errorCallBack = ()=>null ) => {
                const stat = { wait:"wait", ok : "ok" , error : "error" };

                const im = imageUrls.map( e => ( { image : new Image() , stat : stat.wait } ) );

                im.forEach( ( e , i ) => {
                    e.image.onload = () => {
                        e.image.onload = e.image.onerror = null;
                        if( e.stat === stat.wait) { e.stat = stat.ok; callBack( i , e.image );}
                    };
                    e.image.onerror = function(){ e.stat = stat.error;errorCallBack( i  );};
                    e.image.src = imageUrls[i]
                } );

                return im;
};

 

使い方

function onloadImage  ( imageUrls , callBack  , errorCallBack )

引数1:imageUrls

URLの文字列をデータとして持つ配列です。

引数2:callBack

画像の読み込みが成功したとき、呼び出されるコールバック関数です。
呼び出しは、画像ごとにおこなわれます。

コールバックの形式

    callBack( imageUrlsのインデックス番号 , DOMに追加可能なイメージオブジェクト )

このコールバック関数内で、DOM要素への追加や、キャンバスへの書き込みをおこないます。

引数3:errorCallBack

画像の読み込みが失敗したとき、呼び出されるコールバック関数です。
呼び出しは、画像ごとにおこなわれます。

コールバックの形式

    errorCallBack( imageUrlsのインデックス番号 )

 

使用例

HTML

<div id="contents"></div>

JavaScript

 window.addEventListener('DOMContentLoaded',()=> {

            const f = ( index , image ) => { // コールバック関数(成功時)
                document.getElementById("contents").appendChild(image);
            };

            const ef = ( index  ) => { // コールバック関数(失敗時)

                const img = new Image();
                dumyImage( imageoptions ).setImage( img );
                document.getElementById("contents").appendChild(img);
            };

            onloadImage(  ["URL1","URL2"] , f , ef );
});

上のコードは、画像の読み込み完了時に、ID:contentの要素内に画像を追加しています。

読み込み失敗時は、ダミー画像をセットしています。
参考記事:【JavaScript】 ダミー画像をオフラインで動的に作成する

更新日:2020/06/03

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。