0

サインコサインなどの三角関数を使用して画像を歪ませて、波状にすることはできますか?

もしそうなら、どのように。

PHP推奨される言語ですが、どの言語でもかまいません...

4

3 に答える 3

3

はい、可能です。画像はピクセルの単なる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-歪みは、空間的に可変のカーネル(係数行列)を使用した畳み込みフィルターと考えることができます。

于 2010-08-23T23:02:53.620 に答える
3

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

出力

代替テキスト

于 2010-08-24T01:10:39.253 に答える
2

それはあなたのイメージがどのように機能するかに大きく依存します。私はPHPを話さないので、これは一般的な解決策です。

個々のピクセルを移動できる場合、これを行うための概念的に最も簡単な方法は、次のように言うことです。

y old =古いy-ピクセルの
y位置ynew=新しいy-ピクセルの位置x=x-ピクセル
位置
L=ピクセル単位の画像の長さ
N=適用する三角関数のサイクル数(つまり、sin波の数) )。

次に、画像を繰り返し処理します。xの値ごとに、yピクセルを移動します。

y new = y old *(1 + sin(Nπx / L))/ 2

于 2010-08-23T23:00:53.323 に答える