回答編集履歴
2
d
answer
CHANGED
@@ -45,4 +45,4 @@
|
|
45
45
|
img
|
46
46
|
```
|
47
47
|
|
48
|
-

|
1
d
answer
CHANGED
@@ -15,4 +15,34 @@
|
|
15
15
|
img
|
16
16
|
```
|
17
17
|
|
18
|
-

|
18
|
+

|
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
|
+

|