Distorsión de la imagen con el seno / coseno
-
30-09-2019 - |
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 ...
Solución 2
Uso de la respuesta de phadej Tengo una solución ...
La imagen es la siguiente ...
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
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