サンプル・プログラムの実行例
URLオプションとして "tokyoAme.php?filename=ame.png" のように指定すると、PNGファイル "ame.png" を保存(ダウンロード)できる。
サンプル・プログラム
tokyoAme.php | サンプル・プログラム本体 |
解説:準備
0032: //フォント:各自の環境に合わせて
0033: define('FONT', '/virtual/pahoo/public_html/common/font/ipamp.ttf');
画像にデータの取得日時を記載するため、テキストを埋め込む必要がある。
「PHPでTrueTypeフォントを利用する」で解説したとおり、1TurTypeフォント・ファイルを定数 FONT に定義しておく。
また、文字エンコードはUTF-8にする。
解説:画像合成
0094: /**
0095: * 東京アメッシュの画像を表示/保存
0096: * @param string $fname = 保存ファイル名(常にPNG形式)/'':画面表示
0097: * @return string メッセージ/FALSE=取得失敗
0098: */
0099: function tokyoAme($fname='') {
0100: $ti = (int)((time() - 60 * 10) / (60 * 10)) * (60 * 10);
0101: $msg = sprintf("%04d年%02d月%02d日 %02d時%02d分", date('Y', $ti), date('m', $ti), date('d', $ti), date('H', $ti), date('i', $ti));
0102:
0103: $url1 = 'https://tokyo-ame.jwa.or.jp/map/map000.jpg'; //地形
0104: $url2 = 'https://tokyo-ame.jwa.or.jp/map/msk000.png'; //県境
0105: $url3 = 'https://tokyo-ame.jwa.or.jp/mesh/000/' . date('YmdHi', $ti) . '.gif'; //降雨情報
0106:
0107: //画像サイズ
0108: if (($arr = getimagesize($url1)) == FALSE) return FALSE;
0109: $width = $arr[0];
0110: $height = $arr[1];
0111:
0112: //画像合成
0113: if (($img1 = @imagecreatefromjpeg($url1)) == FALSE) return FALSE;
0114: if (($img2 = @imagecreatefrompng($url2)) == FALSE) return FALSE;
0115: if (($img3 = @imagecreatefromgif($url3)) == FALSE) return FALSE;
0116:
0117: imagecopy($img1, $img2, 0, 0, 0, 0, $width, $height);
0118: imagecopy($img1, $img3, 0, 0, 0, 0, $width, $height);
0119:
0120: //日時合成
0121: $color = imagecolorallocate($img1, 0x00, 0x00, 0x40);
0122: imagettftext($img1, 12, 0, 5, $height - 5, $color, FONT, $msg);
0123:
0124: //画像表示
0125: if ($fname == '') {
0126: header('Content-Type: image/png');
0127: imagepng($img1);
0128: //画像保存
0129: } else {
0130: header('Content-Type: image/png');
0131: header('Content-Disposition: attachment; filename=' . $fname .'"');
0132: imagepng($img1);
0133: }
0134:
0135: //画像破棄
0136: imagedestroy($img1);
0137: imagedestroy($img2);
0138: imagedestroy($img3);
0139:
0140: return $msg;
0141: }
このうち、$url3のファイル名は以下の通り。10分間隔で更新されている。
年(4桁)月(2桁)日(2桁)時(2桁)分(2桁).gif
まず、関数 imagecreatefromjpeg , imagecreatefrompng , imagecreatefromgif を使い、3枚の画像をメモリに取り込む。これらの関数はURL上の画像も取り込むことができるので便利だ。
画像合成は、関数 imagecopy を用いて行う。2枚の画像を1枚の画像に合成できる。
画像の大きさを指定する必要があるので、あらかじめ関数 getimagesize を用いて画像の幅と高さを取得しておく。このとき同時に、画像の存在可否をチェックしている。
画像へ日時を埋め込むには、関数 imagettftext を用いている。
合成した画像 $img1 は、関数 header と imagepng を用いてPNG画像としてブラウザ上に表示するか、保存を行う。
本ユーザー関数 tokyoAme に引数が指定されていたら、ローカルドライブにファイル名 $fname で保存する。
最後に、関数 imagedestroy を用いてメモリを解放する。
参考サイト
- 東京アメッシュ
- PHPでTrueTypeフォントを利用する:ぱふぅ家のホームページ
ゲリラ豪雨のツイートをするために利用しようとしたのだが、画像は3枚のレイヤから成っており、そのままでは投稿できない。そこで、PHPを使って1枚の画像に合成してみることにした。
(2022年4月3日)PHP8対応,リファラ・チェック改良