Поворот изображения [PHP]

Discussion in 'PHP' started by Rastamanka, 11 Sep 2012.

  1. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Добрый день.
    Подскажите как повернуть изображение под определенный угол в PHP ?
    imagerotate не предлагать при повороте изображение размывается то есть там где был только черно белый цвет добавляются оттенки черного. Размывается изображение в общем. Необходимо чтобы размытия не было а оставалось в таком же состоянии.
     
  2. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    В общем такая функция была найдена.

    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($srcImgtrue);
            }
            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(000-$theta),
                    
    rotateX($srcw00-$theta),
                    
    rotateX(0$srch0-$theta),
                    
    rotateX($srcw$srch0-$theta)
            );
            
    $minX floor(min($temp));
            
    $maxX ceil(max($temp));
            
    $width $maxX $minX;

            
    // Calculate the height of the destination image.
            
    $temp = array (rotateY(000-$theta),
                    
    rotateY($srcw00-$theta),
                    
    rotateY(0$srch0-$theta),
                    
    rotateY($srcw$srch0-$theta)
            );
            
    $minY floor(min($temp));
            
    $maxY ceil(max($temp));
            
    $height $maxY $minY;
        }

        
    $destimg imagecreatetruecolor($width$height);
        if (
    $ignore_transparent == 0) {
            
    imagefill($destimg00imagecolorallocatealpha($destimg255,255255127));
            
    imagesavealpha($destimgtrue);
        }

        
    // 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 >= && $srcX $srcw && $srcY >= && $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$j0xffffff);
            
            
    $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

    В чем проблема и как ее решить?
     
  3. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Не удалось переопределить функцию.
    Хз, какая у них область видимости.
     
  4. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Хотя все таки при повороте теперь убирается часть изображения. В случае с буквами разрывается связь между частями буквы. Хоть и не расплывается. Есть какие нибудь еще способы повернуть без дефрагментации изображения? Но вопрос на выше поставленный вопрос открыт
     
    #4 Rastamanka, 11 Sep 2012
    Last edited: 11 Sep 2012
  5. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Ну смысл то ошибки я понял. А вот в чем конкретно проблема и где не могу понять.
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Rastamanka
    В вопросе скрывается ответ.Нельзя дважды определять одну функцию внутри пхп. На второй итерации цикла как раз такое переопределение и происходит

    увеличьте ширину полей (незаполненной области) вокруг изображения.
     
    _________________________
  7. KsaAZaks

    KsaAZaks New Member

    Joined:
    27 Jun 2010
    Messages:
    17
    Likes Received:
    1
    Reputations:
    0
    потёрто
     
  8. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    C первым спасибо понял в чем проблема. А вот второе не очень понятно. Незаполненная область при повороте сама добавляется. Да и разрыв происходит посередине изображения. К примеру на тройке оно в двух местах.
     
  9. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    устранови библиотеку imagemagic и сделай exec с одной командой.