Imagecopyresampled after image rotation

I am trying to copy an image (before $img

) after rotating an image (many images $im

), but I get strange behavior. As soon as I comment out the line //$img =

, I only get the rotated image in my final output. Can I rotate the inner one $im

and copy it into the final image $img

?

<?php

$height =  80;
$width  = 300;

$img = imagecreate($width, $height);
$c = imagecolorallocate ($img ,  135, 135, 135);
imagefill($img, 0, 0, imagecolorallocate($img, 255, 255, 255));

for($i=0; $i<=5; $i++){

    $im = imagecreatetruecolor(35, 35);
    $gry = imagecolorallocate($im, 135, 135, 135);
    $wht = imagecolorallocate($im, 255, 255, 255);

    $j = mt_rand(0, 1);

    $ch = mt_rand(0,1)?chr(rand(65, 90)):chr(rand(97, 122));

    if($j == 0){
        imagefill($im, 0, 0, $wht);
        imagefttext($im, 20, 0, 3, 21, $gry, 'AHGBold.ttf', $ch);
        //$img = imagerotate($im, mt_rand(0,10)-5, $wht);
    }else{
        imagefill($im, 0, 0, $gry);
        imagefttext($im, 20, 0, 3, 21, $wht, 'AHGBold.ttf', $ch);
        //$img = imagerotate($im, mt_rand(0,10)-5, $gry);
    }
    imagecopyresampled($img, $im, 5 + $i*42, $height/2 - 12, 0, 0, 40, 40, 25, 25);
}
header('Content-type: image/png');
imagepng($img);

      

+3


source to share


1 answer


change

 $img = imagerotate($im, mt_rand(0,10)-5, $wht);

      

and

 $img = imagerotate($im, mt_rand(0,10)-5, $gry);

      

to

 $im = imagerotate($im, mt_rand(0,10)-5, $wht);

      



and

 $im = imagerotate($im, mt_rand(0,10)-5, $gry);

      

in cases where it imagerotes

doesn't work, you can use the following function to rotate the image:

function imagerotateEquivalent(&$srcImg, $angle, $bgcolor, $ignore_transparent = 0) 
 {
     $srcw = imagesx($srcImg);
     $srch = imagesy($srcImg);

if($angle == 0) return $srcImg;

// Convert the angle to radians
$theta = deg2rad ($angle);


// 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);
imagefill($destimg, 0, 0, imagecolorallocate($destimg, 0,255, 0));

// 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;
}

function rotateX($x, $y, $theta){
    return $x * cos($theta) - $y * sin($theta);
}
function rotateY($x, $y, $theta){
    return $x * sin($theta) + $y * cos($theta);
}

      

I got the above code from a note in php.net

+1


source







All Articles