回答編集履歴

2

d

2020/09/10 04:18

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -92,4 +92,4 @@
92
92
 
93
93
 
94
94
 
95
- ![イメージ説明](5f6d30c841505989b2adbb3b1ec95807.png)
95
+ ![イメージ説明](3299b9d14e2dd0222704c30209ce5055.jpeg)

1

d

2020/09/10 04:18

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -33,3 +33,63 @@
33
33
 
34
34
 
35
35
  ![イメージ説明](05528e2c12f53a4d777fd3045401f1f8.png)
36
+
37
+
38
+
39
+ ## 追記
40
+
41
+
42
+
43
+ > このサイトの4番目のように透過画像の不透明度を操作したかったのですがうまくいきませんでした。
44
+
45
+
46
+
47
+ であれば、putalpha() で一律にアルファチャンネルを同じ値にすると、透明だった画素まで変更されてしまうため駄目です。
48
+
49
+ アルファチャンネルが0でない画素のみ、アルファチャンネルを変更するという条件分岐が必要です。
50
+
51
+ こういう操作は numpy のほうが楽なので、一旦 numpy にしてアルファチャンネルが0でない画素だけ変更したあと、また PIL.Image に戻せばよいと思います。
52
+
53
+
54
+
55
+ ```python
56
+
57
+ from PIL import Image
58
+
59
+
60
+
61
+ img = Image.open("sample.jpg").convert("RGBA")
62
+
63
+ watermark = Image.open("watermark.png").convert("RGBA")
64
+
65
+
66
+
67
+ # 必要であれば、ウォーターマークをリサイズする
68
+
69
+ watermark.thumbnail((500, 500))
70
+
71
+
72
+
73
+ # numpy のほうが操作しやすいので、numpy に一旦する
74
+
75
+ watermark = np.array(watermark)
76
+
77
+ alpha = 30 # 変更後のアルファチャンネルの値
78
+
79
+ watermark[watermark[..., 3] != 0, 3] = alpha
80
+
81
+ watermark = Image.fromarray(watermark)
82
+
83
+
84
+
85
+ # ウォーターマークを貼り付ける
86
+
87
+ img.paste(watermark, (50, 50), watermark)
88
+
89
+ img
90
+
91
+ ```
92
+
93
+
94
+
95
+ ![イメージ説明](5f6d30c841505989b2adbb3b1ec95807.png)