質問するログイン新規登録

回答編集履歴

2

d

2020/09/10 04:18

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -45,4 +45,4 @@
45
45
  img
46
46
  ```
47
47
 
48
- ![イメージ説明](5f6d30c841505989b2adbb3b1ec95807.png)
48
+ ![イメージ説明](3299b9d14e2dd0222704c30209ce5055.jpeg)

1

d

2020/09/10 04:18

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -15,4 +15,34 @@
15
15
  img
16
16
  ```
17
17
 
18
- ![イメージ説明](05528e2c12f53a4d777fd3045401f1f8.png)
18
+ ![イメージ説明](05528e2c12f53a4d777fd3045401f1f8.png)
19
+
20
+ ## 追記
21
+
22
+ > このサイトの4番目のように透過画像の不透明度を操作したかったのですがうまくいきませんでした。
23
+
24
+ であれば、putalpha() で一律にアルファチャンネルを同じ値にすると、透明だった画素まで変更されてしまうため駄目です。
25
+ アルファチャンネルが0でない画素のみ、アルファチャンネルを変更するという条件分岐が必要です。
26
+ こういう操作は numpy のほうが楽なので、一旦 numpy にしてアルファチャンネルが0でない画素だけ変更したあと、また PIL.Image に戻せばよいと思います。
27
+
28
+ ```python
29
+ from PIL import Image
30
+
31
+ img = Image.open("sample.jpg").convert("RGBA")
32
+ watermark = Image.open("watermark.png").convert("RGBA")
33
+
34
+ # 必要であれば、ウォーターマークをリサイズする
35
+ watermark.thumbnail((500, 500))
36
+
37
+ # numpy のほうが操作しやすいので、numpy に一旦する
38
+ watermark = np.array(watermark)
39
+ alpha = 30 # 変更後のアルファチャンネルの値
40
+ watermark[watermark[..., 3] != 0, 3] = alpha
41
+ watermark = Image.fromarray(watermark)
42
+
43
+ # ウォーターマークを貼り付ける
44
+ img.paste(watermark, (50, 50), watermark)
45
+ img
46
+ ```
47
+
48
+ ![イメージ説明](5f6d30c841505989b2adbb3b1ec95807.png)