サインやコサインなどの三角関数を使用して画像を歪ませて、波状にすることはできますか?
もしそうなら、どのように。
PHPが推奨される言語ですが、どの言語でもかまいません...
サインやコサインなどの三角関数を使用して画像を歪ませて、波状にすることはできますか?
もしそうなら、どのように。
PHPが推奨される言語ですが、どの言語でもかまいません...
はい、可能です。画像はピクセルの単なる2次元配列であり、それらを自由に再編成することが可能です。簡単な方法の1つは、歪み関数を使用して、元の画像から新しい画像を作成し、ピクセルをサンプリングすることです。
$original = read_image_pixels(); // using GD or some other way
for ($x = 0; $x < $width; $x++) {
for ($y = 0; $y < $height; $y++) {
// we are adding $height and taking modulo
// to insure that $distorted_y is positive and less then $height.
$distorted_y = ($y + round(10*sin($x/20)) + $height) % $height;
$distorted[$x][$y] = $original[$x][$distorted_y];
}
}
編集:これはさらに一般化することができます。ぼかしやシャープ解除などのよく知られた効果の多くは、畳み込みフィルターです。それらはGameDevの記事でかなりよく説明されています。上記のsin-歪みは、空間的に可変のカーネル(係数行列)を使用した畳み込みフィルターと考えることができます。
phadejの答えを使用して、私は解決策を得ました...
写真はこれです...
コード -
<?php
header("Content-type: image/png");
$im = imagecreatefrompng('pic.png');
$newim = imagecreatetruecolor(imagesx($im),imagesy($im));
for ($x = 0; $x < imagesx($im); $x++) {
for ($y = 0; $y < imagesy($im); $y++) {
$rgba = imagecolorsforindex($im, imagecolorat($im, $x, $y));
$col = imagecolorallocate($newim, $rgba["red"], $rgba["green"], $rgba["blue"]);
$distorted_y = ($y + round(100*sin($x/50)) + imagesy($im)) % imagesy($im);
imagesetpixel($newim, $x, $distorted_y, $col);
}
}
imagepng($newim);
?>
出力
それはあなたのイメージがどのように機能するかに大きく依存します。私はPHPを話さないので、これは一般的な解決策です。
個々のピクセルを移動できる場合、これを行うための概念的に最も簡単な方法は、次のように言うことです。
y old =古いy-ピクセルの
y位置ynew=新しいy-ピクセルの位置x=x-ピクセルの
位置
L=ピクセル単位の画像の長さ
N=適用する三角関数のサイクル数(つまり、sin波の数) )。
次に、画像を繰り返し処理します。xの値ごとに、yピクセルを移動します。
y new = y old *(1 + sin(Nπx / L))/ 2