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

回答編集履歴

1

合成画像を動的にする方法を記載

2020/03/09 06:25

投稿

miyabi_pudding
miyabi_pudding

スコア9559

answer CHANGED
@@ -6,4 +6,66 @@
6
6
  簡単に言うと、PHPなどのサーバーサイドテクノロジーは、如何様なファイルとしても振る舞う事が可能なので、
7
7
  (HTMLだろうが、JavaScriptだろうが。
8
8
  但し、動画などに関してはかなり話が変わってくる)
9
- 現状のコードでなんの問題もなく、PNG画像として扱われています。
9
+ 現状のコードでなんの問題もなく、PNG画像として扱われています。
10
+
11
+ # 追記2に対して
12
+ `img`に対して当てているのは、WordPressの記事ページでしょうか?
13
+ それではダメです。
14
+ なぜなら、それは普通のPHPを返しているからです。
15
+ (おそらく)
16
+
17
+ なぜ、watermark.phpが、PNG画像として認識されるかというと、
18
+ ```php
19
+ header( 'Content-type: image/png' );
20
+ ```
21
+ を実行しているからです。
22
+ これにより、httpヘッダーにて、PNG画像として認識させています。
23
+
24
+ コメントに寄せていただいた、合成画像を動的に、ということを実現するなら、
25
+ 下記のようになりますかね・・・。
26
+
27
+ ```php
28
+ // watermark.php
29
+ <?php
30
+ $stamp = imagecreatefrompng( 'watermark.png' );
31
+ // 下記を、URLパラメータから画像パスを取得できるようにする
32
+ // $im = imagecreatefromjpeg( 'motogazou.jpg' );
33
+ $imagePath = isset($_GET["imagePath"]) ? $_GET["imagePath"] : 'motogazou.jpg';
34
+ $im = imagecreatefromjpeg( $imagePath );
35
+
36
+ // スタンプの余白を設定し、スタンプ画像の幅と高さを取得します
37
+ $marge_right = 10;
38
+ $marge_bottom = 10;
39
+ $sx = imagesx( $stamp );
40
+ $sy = imagesy( $stamp );
41
+
42
+ // スタンプ画像を写真の上にコピーします。余白の値と
43
+ // 写真の幅を元にスタンプの位置を決定します
44
+ imagecopy( $im, $stamp, imagesx( $im ) - $sx - $marge_right, imagesy( $im ) - $sy - $marge_bottom, 0, 0, imagesx( $stamp ), imagesy( $stamp ) );
45
+
46
+ // 出力し、メモリを開放します
47
+ header( 'Content-type: image/png' );
48
+ imagepng( $im );
49
+ imagedestroy( $im );
50
+ ?>
51
+ ```
52
+
53
+ んで、`img`のパスの書き方は下記です。
54
+
55
+ ```php
56
+ <html>
57
+ <head>
58
+ <meta name="viewport" content="width=device-width, minimum-scale=0.1">
59
+ <title>watermark.php (640×480)</title>
60
+ </head>
61
+ <body style="margin: 0px; background: #0e0e0e;">
62
+ <img style="-webkit-user-select: none;margin: auto;" src="https://【ドメイン】/test01/wp-content/themes/storefront-child/watermark.php?imagePath=【画像のURLかパス】" width="640" height="480">
63
+ </body>
64
+ </html>
65
+ ```
66
+ ようは、`watermark.php`に対して、合成したい画像のパスをURLパラメータを渡し、
67
+ `watermark.php`では、その画像パスを使って処理をするように変えたって感じです。
68
+
69
+ ただし、`imagecreatefromjpeg`メソッドが何をしているかは全くわからないので、このままで動くとは限りません。
70
+ なので、この先は、質問者さん自身でいろいろやっていただかないとわかりませんので、
71
+ これ以上の回答は、`imagecreatefromjpeg`が何を処理しているか、など、全ての情報を開示していただかないとできません。