Pregunta

¿Es posible distorsionar una imagen utilizando funciones trigonométricas como sine y coseno para que salga ondulado.

Si es así, cómo.

PHP es el preferido idioma, sino que puede ser cualquier ...

¿Fue útil?

Solución 2

Uso de la respuesta de phadej Tengo una solución ...

La imagen es la siguiente ...

text alt

El código -

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

La salida

text alt

Otros consejos

Sí, es posible. Una imagen es sólo una matriz bidimensional de píxeles y es posible reorganizar libremente. Una forma fácil es crear nuevas imágenes y muestras píxeles de la imagen original a través de alguna función de distorsión.

$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];
  }
}

Edit: Esto se puede generalizar aún más. Muchos de los efectos conocidos como desenfoque y unsharpen son filtros de convolución. Ellos están muy bien explicadas en del artículo GameDev . Podemos pensar en lo anterior sin distorsión como un filtro de convolución con el núcleo espacialmente variable (matriz de coeficientes).

Depende mucho de cómo funciona su imagen. No hablo de PHP, por lo que esta es una solución general.

Si podemos mover los píxeles individuales, la forma conceptualmente más simple de hacer esto sería decir

y viejo = viejo y-posición de un pixel
y new = new y-posición del pixel
x = x-posición del pixel
L = longitud de la imagen en píxeles
N = número de ciclos trigonométricas para aplicar (es decir, número de ondas SIN)

Entonces sólo iterar a través de la imagen. Para cada valor de x, movemos la y-pixel:

y new = y viejo * (1 + sin (N p x / L)) / 2

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top