Можно ли исказить изображение с помощью тригонометрических функций, таких как синус и косинус, чтобы оно получилось волнистым.
Если да, то как.
PHP является предпочтительным языком, но это может быть любой...
Можно ли исказить изображение с помощью тригонометрических функций, таких как синус и косинус, чтобы оно получилось волнистым.
Если да, то как.
PHP является предпочтительным языком, но это может быть любой...
Да, это возможно. Изображение — это всего лишь двумерный массив пикселей, и их можно свободно реорганизовывать. Одним из простых способов является создание нового изображения и выборка пикселей из исходного изображения с помощью некоторой функции искажения.
$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. Вышеупомянутое синус-искажение можно рассматривать как сверточный фильтр с пространственно переменным ядром (матрицей коэффициентов).
Используя ответ 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, так что это общее решение.
Если мы можем перемещать отдельные пиксели, концептуально самый простой способ сделать это — сказать
yold = старое положение y пикселя
yновое = новое положение y пикселя
x = положение x пикселя
L = длина изображения в пикселях
N = количество применяемых тригонометрических циклов (т. е. количество синусоидальных волн)
Затем мы просто перебираем изображение. Для каждого значения x мы перемещаем y-пиксель:
yновый = yстарый * (1+sin(Nπx/L)) / 2