1

This script uploads an image, watermarks it, and also creates a thumbnail of the image. I've edited it to ignore the watermarking of GIF files since GD library breaks the animation when watermarked. It watermarks the appropriate image types just fine, but when a GIF is uploaded, it doesn't stay animated even though it's not watermarked. Here's the full code:

<?php
if(isset($_POST))
{

    $Big            = 980
    $Small          = 400;
    $ThumbPrefix            = "thumb_";
    $DestinationDirectory   = '../folder/';
    $Quality                = 100;


    if (!isset($_SERVER['HTTP_X_REQUESTED_WITH'])){
        die();
    }


    if(!isset($_FILES['ImageFile']) || !is_uploaded_file($_FILES['ImageFile']['tmp_name']))
    {
            die('Error!');
    }


    $Number     = substr(str_shuffle(MD5(microtime())), 0, 10);

    $ImageName      = str_replace(' ','-',strtolower($_FILES['ImageFile']['name']));
    $ImageSize      = $_FILES['ImageFile']['size'];
    $TempSrc        = $_FILES['ImageFile']['tmp_name'];
    $ImageType      = $_FILES['ImageFile']['type'];

    switch(strtolower($ImageType))
    {
        case 'image/png':
            $CreatedImage =  imagecreatefrompng($_FILES['ImageFile']['tmp_name']);
            break;
        case 'image/gif':
            $CreatedImage =  imagecreatefromgif($_FILES['ImageFile']['tmp_name']);
            break;          
        case 'image/jpeg':
        case 'image/pjpeg':
            $CreatedImage = imagecreatefromjpeg($_FILES['ImageFile']['tmp_name']);
            break;
        default:
            die('Unsupported File!');
    }


    list($CurWidth,$CurHeight)=getimagesize($TempSrc);


    $ImageExt = substr($ImageName, strrpos($ImageName, '.'));
    $ImageExt = str_replace('.','',$ImageExt);


    $ImageName      = preg_replace("/\\.[^.\\s]{3,4}$/", "", $ImageName); 


    $NewName = $Number.'-'.$ImageName.'.'.$ImageExt;
    $url = 'http://'.@$_SERVER['HTTP_HOST'].strtr(dirname(dirname($_SERVER['SCRIPT_NAME'])), '\\', '/').'';

    $thumb_ImageName    = $DestinationDirectory.$ThumbPrefix.$NewName; 
    $ImageName          = $DestinationDirectory.$NewName;


    if(resizeImage2($CurWidth,$CurHeight,$Small,$thumb_ImageName,$CreatedImage,$Quality,$ImageType))
    {


        if(!resizeImage($CurWidth,$CurHeight,$MainImageSize,$ImageName,$CreatedImage,$Quality,$ImageType))
            {
                echo 'Error';
            }

$variable = <<<IMG
<p>Image Preview</p></br>
<div class="up">
<img src="$url/folder/$NewName">
<label onclick="document.getElementById('content').value = '$url/folder/$ThumbPrefix$NewName';document.getElementById('extra').value = '$url/folder/$NewName';document.getElementById('imgprev').src = '$url/folder/$ThumbPrefix$NewName';" class="img-submit" for="upload"></label>
</div>
IMG;


echo $variable;


    }else{
        die('Error');
    }
}


function resizeImage($CurWidth,$CurHeight,$MaxSize,$DestFolder,$SrcImage,$Quality,$ImageType)
{
    //Check Image size is not 0
    if($CurWidth <= 0 || $CurHeight <= 0) 
    {
        return false;
    }


    $NewCanves          = imagecreatetruecolor($CurWidth, $CurHeight);
    $watermark = 'watermark/watermark.png';
    if(imagecopyresampled($NewCanves, $SrcImage,0, 0, 0, 0, $CurWidth, $CurHeight, $CurWidth, $CurHeight))
    {
        switch(strtolower($ImageType))
        {
            case 'image/png':
                imagepng($NewCanves,$DestFolder);
                break;
            case 'image/gif':
                imagegif($NewCanves,$DestFolder);
                break;          
            case 'image/jpeg':
            case 'image/pjpeg':
                imagejpeg($NewCanves,$DestFolder,$Quality);
                break;
            default:
                return false;
        }


            if (($ImageType =="image/pjpeg" OR $ImageType =="image/jpeg" OR $ImageType =="image/jpg"))
            {
            $watermark = imagecreatefrompng($watermark);

            $watermark_width  = imagesx($watermark);
            $watermark_height = imagesy($watermark);

            $watermark_x = ($CurWidth-$watermark_width);
            $watermark_y = ($CurHeight-$watermark_height)/2;
            imagecopy($NewCanves, $watermark, $watermark_x, $watermark_y, 0, 0, $watermark_width, $watermark_height);
            }

            imagejpeg($NewCanves,$DestFolder,$Quality); 

    if(is_resource($NewCanves)) {imagedestroy($NewCanves);} 
    return true;
    }

}


function resizeImage2($CurWidth,$CurHeight,$MaxSize,$DestFolder,$SrcImage,$Quality,$ImageType)
{

    if($CurWidth <= 0 || $CurHeight <= 0) 
    {
        return false;
    }

    //Construct a proportional size of new image
    $ImageScale         = min($MaxSize/$CurWidth, $MaxSize/$CurWidth); 
    $Width              = ceil($ImageScale*$CurWidth);
    $Height             = ceil($ImageScale*$CurHeight);
    $NewCanves          = imagecreatetruecolor($Width, $Height);
    $watermark = 'watermark/watermark.png';

    if(imagecopyresampled($NewCanves, $SrcImage,0, 0, 0, 0, $Width, $Height, $CurWidth, $CurHeight))
    {
        switch(strtolower($ImageType))
        {
            case 'image/png':
                imagepng($NewCanves,$DestFolder);
                break;
            case 'image/gif':
                imagegif($NewCanves,$DestFolder);
                break;          
            case 'image/jpeg':
            case 'image/pjpeg':
                imagejpeg($NewCanves,$DestFolder,$Quality);
                break;
            default:
                return false;
        }




        imagejpeg($NewCanves,$DestFolder,$Quality);


    if(is_resource($NewCanves)) {imagedestroy($NewCanves);} 
    return true;
    }

}

I noticed that if I use:

if(!move_uploaded_file($_FILES['ImageFile']['tmp_name'], $DestinationDirectory.$NewImageName ))

instead of:

if(!resizeImage($CurWidth,$CurHeight,$MainImageSize,$DestRandImageName,$CreatedImage,$Quality,$ImageType))

then the GIFs will stay animated, but then it doesn't watermark anything anymore. I'm throughly confused. My knowledge of PHP is very limited. Does anyone have any ideas? Thanks.

phpnoob
  • 19
  • 3

1 Answers1

0

You should not convert GIF image to jpg or png type if you want the gif image to animate

jameshwart lopez
  • 2,993
  • 6
  • 35
  • 65
  • This code `$watermark = imagecreatefrompng($watermark);` inside resizeImage function . I think you should only use GIF type of image for animated image – jameshwart lopez Jun 05 '15 at 01:11