Добрый день. Подскажите как повернуть изображение под определенный угол в PHP ? imagerotate не предлагать при повороте изображение размывается то есть там где был только черно белый цвет добавляются оттенки черного. Размывается изображение в общем. Необходимо чтобы размытия не было а оставалось в таком же состоянии.
В общем такая функция была найдена. PHP: function imagerotateEquivalent($srcImg, $angle, $bgcolor, $ignore_transparent = 0) { function rotateX($x, $y, $theta){ return $x * cos($theta) - $y * sin($theta); } function rotateY($x, $y, $theta){ return $x * sin($theta) + $y * cos($theta); } $srcw = imagesx($srcImg); $srch = imagesy($srcImg); //Normalize angle $angle %= 360; //Set rotate to clockwise $angle = -$angle; if($angle == 0) { if ($ignore_transparent == 0) { imagesavealpha($srcImg, true); } return $srcImg; } // Convert the angle to radians $theta = deg2rad ($angle); //Standart case of rotate if ( (abs($angle) == 90) || (abs($angle) == 270) ) { $width = $srch; $height = $srcw; if ( ($angle == 90) || ($angle == -270) ) { $minX = 0; $maxX = $width; $minY = -$height+1; $maxY = 1; } else if ( ($angle == -90) || ($angle == 270) ) { $minX = -$width+1; $maxX = 1; $minY = 0; $maxY = $height; } } else if (abs($angle) === 180) { $width = $srcw; $height = $srch; $minX = -$width+1; $maxX = 1; $minY = -$height+1; $maxY = 1; } else { // Calculate the width of the destination image. $temp = array (rotateX(0, 0, 0-$theta), rotateX($srcw, 0, 0-$theta), rotateX(0, $srch, 0-$theta), rotateX($srcw, $srch, 0-$theta) ); $minX = floor(min($temp)); $maxX = ceil(max($temp)); $width = $maxX - $minX; // Calculate the height of the destination image. $temp = array (rotateY(0, 0, 0-$theta), rotateY($srcw, 0, 0-$theta), rotateY(0, $srch, 0-$theta), rotateY($srcw, $srch, 0-$theta) ); $minY = floor(min($temp)); $maxY = ceil(max($temp)); $height = $maxY - $minY; } $destimg = imagecreatetruecolor($width, $height); if ($ignore_transparent == 0) { imagefill($destimg, 0, 0, imagecolorallocatealpha($destimg, 255,255, 255, 127)); imagesavealpha($destimg, true); } // sets all pixels in the new image for($x=$minX; $x<$maxX; $x++) { for($y=$minY; $y<$maxY; $y++) { // fetch corresponding pixel from the source image $srcX = round(rotateX($x, $y, $theta)); $srcY = round(rotateY($x, $y, $theta)); if($srcX >= 0 && $srcX < $srcw && $srcY >= 0 && $srcY < $srch) { $color = imagecolorat($srcImg, $srcX, $srcY ); } else { $color = $bgcolor; } imagesetpixel($destimg, $x-$minX, $y-$minY, $color); } } return $destimg; } Все хорошо но есть задача такая. Изначально имеем букву-цифру под определенным углом. Необходимо выяснить угол под которым данное изображение повернуто. Выясняем это методом сравнивания. Поворачиваем на 1 градус и смотрим ширину символа. Когда символ имеет наименьшую ширину на такой угол и надо его повернуть. Выясняю это функцией вот такой. Фунция get_size_num возвращает ширину символа. PHP: function rotate_img($image) { $start = get_size_num($image); $angel = 0; for ($j=0;$j<20;$j++) { $s = 0; $rotate = imagerotateEquivalent($image, $j, 0xffffff); $s = get_size_num($rotate); if($s < $start) { $start = $s; $angel = $j; } } echo "Угол на который надо повернуть: ".$angel." Символ занимает: ".$start." пикселей"; } Так вот все бы хорошо но в цикле почему то вылазиет ошибка Fatal error: Cannot redeclare rotateX() (previously declared in Z:\home\localhost\www\razp\index.php:136) in Z:\home\localhost\www\razp\index.php on line 136 В чем проблема и как ее решить?
Хотя все таки при повороте теперь убирается часть изображения. В случае с буквами разрывается связь между частями буквы. Хоть и не расплывается. Есть какие нибудь еще способы повернуть без дефрагментации изображения? Но вопрос на выше поставленный вопрос открыт
Rastamanka В вопросе скрывается ответ.Нельзя дважды определять одну функцию внутри пхп. На второй итерации цикла как раз такое переопределение и происходит увеличьте ширину полей (незаполненной области) вокруг изображения.
C первым спасибо понял в чем проблема. А вот второе не очень понятно. Незаполненная область при повороте сама добавляется. Да и разрыв происходит посередине изображения. К примеру на тройке оно в двух местах.