Файл: sys/inc/MultiWave.php
Строк: 43
<?php
function MultiWave( $img )
{
$width = imagesx( $img );
$height = imagesy( $img );
$img2 = imagecreatetruecolor( $width, $height );
$rand1 = mt_rand( 700000, 1000000 ) / 15000000;
$rand2 = mt_rand( 700000, 1000000 ) / 15000000;
$rand3 = mt_rand( 700000, 1000000 ) / 15000000;
$rand4 = mt_rand( 700000, 1000000 ) / 15000000;
// фазы
$rand5 = mt_rand( 0, 3141592 ) / 1000000;
$rand6 = mt_rand( 0, 3141592 ) / 1000000;
$rand7 = mt_rand( 0, 3141592 ) / 1000000;
$rand8 = mt_rand( 0, 3141592 ) / 1000000;
// амплитуды
$rand9 = mt_rand( 400, 600 ) / 100;
$rand10 = mt_rand( 400, 600 ) / 100;
for ( $x = 0; $x < $width; $x++ ) {
for ( $y = 0; $y < $height; $y++ ) {
// координаты пикселя-первообраза.
$sx = $x + ( sin( $x * $rand1 + $rand5 ) + sin( $y * $rand3 + $rand6 ) ) * $rand9;
$sy = $y + ( sin( $x * $rand2 + $rand7 ) + sin( $y * $rand4 + $rand8 ) ) * $rand10;
// первообраз за пределами изображения
if ( $sx < 0 || $sy < 0 || $sx >= $width - 1 || $sy >= $height - 1 ) {
$color = 255;
$color_x = 255;
$color_y = 255;
$color_xy = 255;
} else { // цвета основного пикселя и его 3-х соседей для лучшего антиалиасинга
$color = ( imagecolorat( $img, $sx, $sy ) >> 16 ) & 0xFF;
$color_x = ( imagecolorat( $img, $sx + 1, $sy ) >> 16 ) & 0xFF;
$color_y = ( imagecolorat( $img, $sx, $sy + 1 ) >> 16 ) & 0xFF;
$color_xy = ( imagecolorat( $img, $sx + 1, $sy + 1 ) >> 16 ) & 0xFF;
} // сглаживаем только точки, цвета соседей которых отличается
if ( $color == $color_x && $color == $color_y && $color == $color_xy ) {
$newcolor = $color;
} else {
$frsx = $sx - floor( $sx ); //отклонение координат первообраза от целого
$frsy = $sy - floor( $sy );
$frsx1 = 1 - $frsx;
$frsy1 = 1 - $frsy;
// вычисление цвета нового пикселя как пропорции от цвета основного пикселя и его соседей
$newcolor = floor( $color * $frsx1 * $frsy1 + $color_x * $frsx * $frsy1 + $color_y * $frsx1 * $frsy + $color_xy * $frsx * $frsy );
}
imagesetpixel( $img2, $x, $y, imagecolorallocate( $img2, $newcolor, $newcolor, $newcolor ) );
}
}
return $img2;
}