.toDataURL() で渡しているのはポインタではありません。
🔎 何が渡されているのか?
|
1 2 |
const data = canvas.toDataURL(); img.src = data; |
この toDataURL() が返しているのは…
Base64エンコードされた画像データを含む「文字列」
です。
例えば実際はこんな感じになります:
|
1 |
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA... |
つまり:
- メモリアドレス ❌
- ポインタ ❌
- ただの巨大な文字列 ✅
🧠 C言語のポインタとの違い
C言語なら:
|
1 2 |
int x = 10; int *p = &x; |
ここで p は x のメモリアドレスを持っていますよね。
でも JavaScript の toDataURL() は:
- メモリアドレスを渡しているわけではない
- canvasの中身を 丸ごとエンコードしてコピーしている
なので概念的には:
「ポインタ」ではなく「画像データのコピー」
です。
🎨 じゃあなぜ <img> に表示できるの?
ブラウザは
|
1 |
data:image/png;base64,... |
という形式を「データURL」として解釈できます。
つまり:
URLの代わりに、直接画像データを書いている
という仕組みです。
🔥 もしポインタ的な動きをさせたいなら?
実はそれに近いものはあります。
|
1 2 3 4 |
canvas.toBlob(blob => { const url = URL.createObjectURL(blob); img.src = url; }); |
この createObjectURL() は:
- メモリ上のオブジェクトへの参照URLを作る
- 比較的「参照」に近い概念
なのでこちらのほうが「ポインタ的」と言えなくもないです。
| 概念 | toDataURL |
|---|---|
| Cのポインタ | ❌ |
| メモリアドレス | ❌ |
| 画像データの文字列 | ✅ |
| コピーか? | ✅(完全コピー) |
画像データの文字列、ということはSVG画像みたいな感じですか?
結論から言うと――
似ている部分はあるけど、本質は違います。
✅ 共通点
- どちらも「文字列として扱える」
<img src="...">に直接渡せる- ファイルを介さず表示できる
ここだけ見ると、確かにSVGっぽいです。
❌ でも決定的に違う
🟢 SVG(例:Scalable Vector Graphics)
- 中身は「ベクター命令」
- 人間が読める
- 数式・座標ベース
- 拡大しても劣化しない
つまり
👉 構造そのものがテキスト
🔵 canvas.toDataURL()
|
1 |
canvas.toDataURL() |
返るのは:
|
1 |
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA... |
これは:
- PNG画像を
- Base64でエンコードした
- バイナリデータの文字列表現
つまり
👉 中身はラスター画像(ピクセルの塊)
読めません。人間には無理です。
🧠 例えるなら
| 種類 | たとえ |
|---|---|
| SVG | 設計図 |
| toDataURL | 完成した写真 |
| Cポインタ | 設計図の住所 |
🔥 重要な理解ポイント
SVGは:
「どう描くか」を保存している
toDataURLは:
「描かれた結果」を保存している
なので:
- SVG → 再計算される
- canvas → 固まったビットマップ
🎯 Webゲーム的に見ると
- リアルタイム描画 → canvas
- UIアイコンや軽量図形 → SVG
という使い分けになります。
コメント