digitorum.ru

Как меня найти

Профиль

icq: 4415944

Изогнуть изображение средствами gd (php)

GD, php

Еще один пост из серии "how to".

Продолжаем моучать ботов. Точнее не столько ботов, сколько php. 

Попробуем изогнуть ранее созданное изображение. Нужно получить что-то такое:

<?php
	/*
	* Получить новое значение по x
	* @param int $x
	* @param int $y
	* @param int $maxX - ширина изображения
	* @param int $maxY - высота ихображения
	* @param int $amplitude - "амплитуда" смещения
	* @param int $degres - сколько "градусов" помещается в $maxY (для тригонометрической функции, определяет количество изгибов)
	*/
	function getX($x, $y, $maxX, $maxY, $amplitude = 1, $degres = 180) {
		static $cache = array();
		
		if(!isset($cache[$y])) {
			$cache[$y] =  $amplitude * sin(deg2rad(ceil($y * $degres / $maxY))) - $amplitude;
		}
		$x = $x + $cache[$y];
		if($x > $maxX) {
			$x = $x - $maxX;
		} else if($x < 0) {
			$x = $maxX + $x;
		}
		return $x;
	}
	
	/*
	* Изогнуть изображение
	* @param resource $im - ресурс изображения
	* @param int $amplitude - "амплитуда" смещения
	* @param int $degres - сколько "градусов" помещается в $maxY (для тригонометрической функции)
	*/
	function bendImage($im, $amplitude = 1, $degres = 180) {
		$captchaWidth = imagesx($im);
		$captchaHeight = imagesy($im);
		$rIm = imagecreatetruecolor($captchaWidth, $captchaHeight);
		for($i = 0; $i < $captchaWidth; ++$i) {
			for($j = 0; $j < $captchaHeight; ++$j) {
				$rgb = imagecolorat($im, $i, $j);
				imagesetpixel($rIm, getX($i, $j, $captchaWidth, $captchaHeight, $amplitude, $degres), $j, $rgb);
			}
		}
		return $rIm;
	}

 

Использование:

<?php
	$im = bendImage($im, 21, 180);

 

Не самая "ресурсосберегающая" операция.