質問編集履歴

3

誤字修正

2024/05/10 09:02

投稿

jopeg
jopeg

スコア1

test CHANGED
File without changes
test CHANGED
@@ -1,7 +1,8 @@
1
1
  ### 実現したいこと
2
2
 
3
+ jsで透明度を持った画像を複数枚描画するとき、画像同士が重なることがあります。
3
- jsで透明度を持った画像を大量に描画するとき、画像同士が重なるとがあります。このとき、drawImageで何も設定せずに描画すると、alpha値は算され、重なるほどにalpha値が大きくなっていってしまいます。
4
+ このとき、何も設定せずにdrawImageで描画すると、alpha値は算され、重なるほどにalpha値が大きくなっていってしまいます。
4
- このようなalpha値が累積されような描画ではなく、alpha値の高い方のみが描画されるような描画を目指しています。
5
+ 今回実現したいのは、このようなalpha値が加算されていくような描画ではなく、alpha値の高い方のみが描画されるような描画」になります。
5
6
  なお今回使用される画像は単色で、alpha値で濃淡が表現されています。
6
7
 
7
8
  ↓今(重なったところがより濃くなってしまう)

2

サンプル画像を追加

2024/05/10 08:35

投稿

jopeg
jopeg

スコア1

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,13 @@
3
3
  jsで透明度を持った画像を大量に描画するとき、画像同士が重なることがあります。このとき、drawImageで何も設定せずに描画すると、alpha値は乗算され、重なるほどにalpha値が大きくなっていってしまいます。
4
4
  このようなalpha値が累積されるような描画ではなく、alpha値の高い方のみが描画されるような描画を目指しています。
5
5
  なお今回使用される画像は単色で、alpha値で濃淡が表現されています。
6
+
7
+ ↓今(重なったところがより濃くなってしまう)
8
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-05-10/d128ea88-928a-4c6b-89e8-3f855866f362.jpeg)
9
+
10
+ ↓理想(重なっても滑らか)
11
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-05-10/5b2410d1-6e6c-4d2f-8f21-7368106b503f.jpeg)
12
+
6
13
 
7
14
  ### 試したこと
8
15
 
@@ -24,5 +31,6 @@
24
31
  今回実現したいのは、より高い透明度を持った方のみの描画になります。
25
32
 
26
33
 
34
+
27
35
  拙い文章で申し訳ありませんが
28
36
  ご助力、よろしくお願いいたします。

1

サンプルコードを追加

2024/05/10 08:22

投稿

jopeg
jopeg

スコア1

test CHANGED
File without changes
test CHANGED
@@ -6,6 +6,23 @@
6
6
 
7
7
  ### 試したこと
8
8
 
9
- [getImageData](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/getImageData)でImageDataを取得して、配列を直接書き換える方法を試しました。この方法なら一応実現できましたが、描画頻度が高く、画像サイズが大きいため、処理落ちは避けられません。他の方法がなければ、これをより効率化していく方向で実装しようと思いますが、それにも限界があると思い、できればCanvasの描画機能内で実現できるこが理想だと思っています。
9
+ [getImageData](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/getImageData)でImageDataを取得して、配列を直接書き換える方法を試しました。この方法なら一応実現できましたが、描画頻度が高く、画像サイズが大きいため、処理落ちは避けられません。他の方法がなければ、これをより効率化していく方向で実装しようと思いますが、それにも限界があると思い、できればCanvasの描画機能内で実現したいと思っています。
10
10
 
11
+ ### サンプルコード
12
+ 全文を載せると膨大になるため主要な箇所だけを記載します
13
+ ```javascript
14
+ const canvas = document.createElement('canvas');
15
+ const ctx = canvas.getContext('2d', {alpha: true, willReadFrequently: true});
16
+ function pointerMove (event) {
17
+ ctx.globalAlpha = event.pressure; // 筆圧から透明度を設定
18
+ ctx.drawImage(img, event.clientX, event.clientY); // 画像を描画 (画像自体も透明度をもつ)
19
+ }
20
+ document.addEventListener('pointermove', pointerMove);
21
+ ```
22
+ 上記のような処理で画像同士が重なると下レイヤーの画像の影響を受けます。
23
+ その結果、筆圧で設定した透明度と下レイヤーの透明度が合計された状態で描画されることになります。
24
+ 今回実現したいのは、より高い透明度を持った方のみの描画になります。
25
+
26
+
27
+ 拙い文章で申し訳ありませんが
11
28
  ご助力、よろしくお願いいたします。