回答編集履歴

1

コードサンプルを追加

2017/11/17 09:17

投稿

defghi1977
defghi1977

スコア4756

test CHANGED
@@ -7,3 +7,79 @@
7
7
  例えば8分の1スケールとする場合は半分にする処理を3回繰り返します.
8
8
 
9
9
  - filterを使ってよいのであれば, blurを用いて元画像を一旦ぼかした上で縮小するときれいに縮小できます.
10
+
11
+
12
+
13
+ ---
14
+
15
+
16
+
17
+ ここではインメモリ`canvas`を使ってオフスクリーンでの画像縮小を行っています. なお, 縮小途中の画像の一時保管先としては`createPattern`メソッドによる`CanvasPattern`オブジェクトを用いるのが便利です.
18
+
19
+
20
+
21
+ ```JavaScript
22
+
23
+ //書き込みたい画像
24
+
25
+ const img = document.querySelector("img");
26
+
27
+ //画像縮小用のインメモリcanvas
28
+
29
+ const tmp = document.createElement("canvas");
30
+
31
+
32
+
33
+ //初回書き込み
34
+
35
+ tmp.width = img.naturalWidth;
36
+
37
+ tmp.height = img.naturalHeight;
38
+
39
+ const tctx = tmp.getContext("2d");
40
+
41
+ tctx.drawImage(img, 0, 0);
42
+
43
+
44
+
45
+ //リサイズ処理を3回繰り返す
46
+
47
+ for(let i = 0; i < 3; i++){
48
+
49
+ //現在の描画内容をCanvasPatternオブジェクトとして保存
50
+
51
+ const pattern = tctx.createPattern(tmp, "no-repeat");
52
+
53
+ //canvasをリサイズ
54
+
55
+ tmp.width /= 2;
56
+
57
+ tmp.height /= 2;
58
+
59
+ //スケールを0.5倍に
60
+
61
+ tctx.scale(0.5, 0.5);
62
+
63
+ //パターン画像を描画する
64
+
65
+ tctx.fillStyle = pattern;
66
+
67
+ tctx.fillRect(0, 0, tmp.width * 2, tmp.height * 2);
68
+
69
+ }
70
+
71
+
72
+
73
+ //縮小結果を転写する
74
+
75
+ const canvas = document.querySelector("canvas");
76
+
77
+ canvas.width = tmp.width;
78
+
79
+ canvas.height = tmp.height;
80
+
81
+ const ctx = canvas.getContext("2d");
82
+
83
+ ctx.drawImage(tmp, 0, 0);
84
+
85
+ ```