View file social/sys/inc/MultiWave.php

File size: 2.37Kb
<?
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;
}
?>