[69-13] Canvasで画像データをURLとして取得しよう

最終更新日:2019年02月06日  (初回投稿日:2015年05月04日)

Canvasは、toDataURL() というメソッドを使って、Canvas上の内容をURL文字列で取得することもできます。
いわゆるインラインイメージってやつを Canvasで作れちゃうってことですよね。

少し前の「[69-11] Canvasでビットマップを操作しよう」の「サンプル4」で、<img >要素の画像を Canvasに取り込んでみましたが、今回は逆に、Canvas上の画像を <img >要素に表示してみます。
<img>の src属性の値に、取得したURL文字列を設定するんです。

なんのこっちゃ? でしょうけど、サンプルで動作を確認してみてください。

今回のサンプルはこちら。

黄色いバラは<img >要素に jpeg画像を貼ったもの。
セピアのほうは、その<img >の画像をゲットしてセピア調に変えてから Canvasに描画したもの。

それぞれを、一番下の<img >要素(ブルーのやつ)に、URLを介して表示させられます。どんなURLになっているか確認するために テキストエリアも用意しました。
テキストエリアの下のボタンを押すと、一番下の<img >要素(今はブルーのgif画像が貼ってあります)に、そのURLを使って画像が表示されるという仕掛けです。

toDataURL() は、引数無しだと PNGで出力します

<img >要素の画像(黄色いバラ)をURL化するためのボタンのソースです。
そのままでは無理なので、新しいCanvasを作って、それに画像をゲットし、URL化してtextarea要素へ出力しています。

// ボタンA
function toAurl() {
  var newCanvas = document.createElement('canvas');
  var ctxA = newCanvas.getContext('2d');
  var getimgA = document.getElementById('rose');
  newCanvas.width = rose.width;
  newCanvas.height = rose.height;
  ctxA.drawImage(getimgA, 0, 0);
  var tarea1 = document.getElementById('textArea');
  tarea1.value = newCanvas.toDataURL();
};

8行目までは、新しいCanvasを作り、黄色いバラの画像をゲットし、サイズもそれに合わせて、新しいCanvasに描画しています。(このCanvasはブラウザ上には表示されません)

10行目で、<textarea>要素に、Canvas(変数newCanvas)のデータをURLとして出力する指令を書いています。

上のソース(の10行目)のように、
.toDataURL() の ()の中の引数を省略して書くと、画像データはPNGファイルになります。

この引数は、MIMEタイプで画像を指定します。
デフォルトは「image/png」なので、省略で「image/png」を指定したことに。

黄色いバラの下のボタンを押して、<textarea>要素の表示を見てみると、なってますね、PNGに。

MIMEタイプのすぐあとに、base64 とありますが、これはエンコード方式。画像(バイナリデータ)を文字列(テキストデータ)に変換する方式で、メールもこのbase64だって。

toDataURL() の引数、jpeg の場合は画質の引数もあります

.toDataURL() で ('image/jpeg') とjpegを指定したときは、もう1つ引数を使って画質を指定することができます。

これはボタンBのソース。Canvasのセピア調のバラのURLを出力するとき jpeg を指定しています。
第2引数に0.8と入れているのが画質の指定。0.0〜1.0まで指定できるんだって。

// ボタンB
function toBurl() {
  var tarea2 = document.getElementById('textArea');
  tarea2.value = cnvs.toDataURL('image/jpeg' , 0.8);
};

セピアのバラの下のボタンを押して、<textarea>要素の表示を見てみると、jpegになってますね。

ちなみに画質を「0.0」にするとこんなかんじ。使えんな。0.5からなら、元の画像にもよるけど、いけそうでした。

toDataURL() で取得した画像のURLを、<img>要素の srcに割り当てる

これはボタンCのソースです。
<textarea>要素に表示された URL文字列を、下の<img>要素のsrc属性の値に設定しています。

// ボタンC
function toCurl() {
  var getimgC = document.getElementById('oput');
  oput.src = textArea.value;
};

ちなみに、<textarea>要素に表示された URL文字列をコピーして、ブラウザのアドレスバーにペーストしても画像を表示することができます。

Canvasのグラフィックスのアクセス制限(セキュリティエラー)

Canvasでの操作は javaScriptを使いますので、基本的に同じオリジン(ドメイン)内でしかデータのやり取りができないようになっています。

ただ、Canvasでは、以下のような描き出しはできるそうです。

  • 他のドメインからのリソースを貼った<img>要素や<video>要素を、fillstyleでパターンで描画
  • 他のドメインからのリソースを貼った<img>要素や<video>要素を、strokestyleでパターンで描画
  • 他のドメインからのリソースを貼った<img>要素や<video>要素を、drawImageで描画
  • 上の方法で書き出した Canvasを drawImageで描画

ここまで↑はできるのですが、こうして作った Canvas上で、以下のような、その <img>要素や <video>要素の内容に直接アクセスするような操作はできないようになっています。

  • getImageData() メソッドを呼び出して画像を ImageData化する
  • toDataURL() メソッドを呼び出して画像をURL文字列化する

メソッドを呼び出した時点で、セキュリティエラーが発生するそうです。

次回予告

さて、次回はとうとう(笑)Canvasでアニメーションを作ってみますよ。
といってもまあ、非エンジニアの私でもできる程度の簡単なアニメーションです。
ラインを描いて時間に合わせて回す、アナログ時計を作ってみました。けっこう大変でした。笑!

関連記事
このエントリーをはてなブックマークに追加

やる気を保つためにランキングに参加しています。
応援してくださると すっごいやる気を出します! (笑)

初心者にも使いやすい(と思う)レンタルサーバー

「初心者ですがレンタルサーバーはどこがいい?」というご質問をよくいただきます。
自由にファイルをアップロードできる自分のサーバがあると便利ですよね。ローカル環境じゃなくサーバ上で試してみたい時がありますからね。
私が使っているのは、 スターサーバーロリポップ!です。どちらも管理画面がわかりやすく、マニュアルも充実していて、料金も安い。どちらもライトプラン以上で WordPress が使えます。
初心者が始めやすいサーバだと思います。

ちょっと料金は高いけど、さくらのレンタルサーバや、エックスサーバー は、やはり老舗なのでおすすめです。
両方とも高スペックでコスパが良く、老舗でユーザーが多いので、質問する場がたくさんあります。初心者だけど仕事でサーバが欲しい場合は、安心なのではないかと思います。

スポンサーリンク

コメントの投稿

ご注意:メールアドレスは書かないで
「コメントを送信する」ボタンを押した後の「確認画面」で、メールアドレス・URL などを入力できるようになっており、メールアドレス・URL は、そのままオートリンクになる仕様です。
当方でメールアドレスだけ削除することも、メールアドレスを非公開にすることもできません
メールアドレスは書かないでください。詳しくはこちらにまとめましたのでご覧ください。

スポンサーリンク
最新記事
Category
オススメの本
Links
Calendar
11 | 2023/12 | 01
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -
Archive
Profile

yuki★hata

Author : yuki★hata
せめて月1回の更新をめざします~。

メールフォームはこちら

スポンサーリンク
スポンサーリンク
Copyright © ほんっとにはじめてのHTML5とCSS3 All Rights Reserved.