2019-07-08 php
imagemagickを使えば簡単なんだけど、PHPのGDしか使えない環境だったので、いろいろ調べて以下コードで実現した。
<?php /** * @param resource $img imagecreatefromjpeg等の画像リソース * @param int $width 変換させる幅 * @param int $height 変換させる高さ * @param int $period 周期の大きさ(1~) * @param int $amplitude 振幅の大きさ(1~) * @return resource */ function imageWave($img, $width, $height, $period = 10, $amplitude = 5) { $p = $period * rand(1, 3); $k = mt_rand(0, 100); for ($i = 0; $i<$width; $i++) { imagecopy($img, $img, $i-1, sin($k+$i/$p) * $amplitude, $i, 0, 1, $height); } $k = mt_rand(0,100); for ($i = 0; $i<$height; $i++) { imagecopy($img, $img, sin($k+$i/$p) * $amplitude, $i-1, 0, $i, $width, 1); } return $img; } // 使い方 $img = imagecreatefromjpeg("test.jpg"); $img = imageWave($img, imagesx($img), imagesy($img), 10, 10); imagejpeg($img, "out.jpg");
実際に変換してみた。
↑元画像、↓変換後画像。いい感じ。