犬ターネット

PHPのGDだけで画像に波の効果を加える

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");

実際に変換してみた。

↑元画像、↓変換後画像。いい感じ。

nanaco っているのか
スタジオ、ランチパック、震える舌