简体   繁体   中英

storing frames of animated gif while resizing

i have a page where users can upload there photo that photo will be resized while uploading to server . i am using php to resize the images but the problem is when users upload animated gifs the animation is getting lost and when i checked i found that frames are not being stored in server . so is there anyway we can store frames as well using php so that resized image with animation can be shown.in addition how to identify whether the image being uploaded by users is animated or not using php.

class resizeimage{
var $type;
var $width;
var $height;
var $resize_width;
var $resize_height;
var $cut;
var $srcimg;
var $dstimg;
var $im;

var $fill;

function resizeimage($img, $image_type, $target, $wid, $hei,$c = 0, $qu = 75, $fill = '')
{
    $this->srcimg = $img;
            $this->fill = $fill;
    $this->resize_width = $wid;
    $this->resize_height = $hei;
    $this->cut = $c;
    if (eregi("jpg",$image_type) || eregi("jpeg",$image_type)) {
        $this->type="jpg";
    }

    elseif (eregi("gif",$image_type)) {
        $this->type="gif";
    }

    elseif (eregi("png",$image_type) || eregi("png",$image_type)) {
        $this->type="png";
    }

    else {
        echo "Not Supported File";
        exit();
    }
    $this->initi_img();
    $this -> dst_img($target);
    $this->width = imagesx($this->im);
    $this->height = imagesy($this->im);
    // add by stan
    if (!$this->resize_height) {
        $this->resize_height = $this->resize_width*($this->height/$this->width);
    }
    if (!$this->resize_width) {
        $this->resize_width = $this->resize_height*($this->width/$this->height);
    }
    $this->newimg($qu);
    ImageDestroy ($this->im);
}
function newimg($qu)
{
    $resize_ratio = ($this->resize_width)/($this->resize_height);
    $ratio = ($this->width)/($this->height);
    if ($ratio>=$resize_ratio) {
        $offset_x = 0;
        $offset_y = ceil(($this->resize_height - $this->resize_width/$ratio)/2);
        $copy_width = $this->resize_width;
        $copy_height = $this->resize_height/$ratio;
    }
    else {
        $offset_y = 0;
        $offset_x = ceil(($this->resize_width-$this->resize_height*$ratio)/2);
        $copy_width = $this->resize_height*$ratio;
        $copy_height = $this->resize_height;
    }
    if(($this->cut)=="1")
    {
        if($ratio>=$resize_ratio)
        {
            $newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
            imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width,$this->resize_height, (($this->height)*$resize_ratio), $this->height);
            ImageJpeg ($newimg,$this->dstimg,$qu);
        }
        if($ratio<$resize_ratio)
        {
            $newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
            imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, $this->resize_height, $this->width, (($this->width)/$resize_ratio));
            ImageJpeg ($newimg,$this->dstimg,$qu);
        }
    }
    else
    {
        if ($this->fill == 'black') {
            $newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
            $bg = imagecolorallocate($newimg, 0, 0, 0);
            imagefill($newimg, 0, 0, $bg);
            imagecopyresampled($newimg, $this->im, $offset_x, $offset_y, 0, 0, $copy_width, $copy_height, $this->width, $this->height);
            ImageJpeg ($newimg,$this->dstimg,$qu);
        }
        elseif ($this->fill == 'white') {
            $newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
            $bg = imagecolorallocate($newimg, 255, 255, 255);
            imagefill($newimg, 0, 0, $bg);
            imagecopyresampled($newimg, $this->im, $offset_x, $offset_y, 0, 0, $copy_width, $copy_height, $this->width, $this->height);
            ImageJpeg ($newimg,$this->dstimg,$qu);
        }
        elseif($ratio>=$resize_ratio)
        {
            $newimg = imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio);
            imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, ($this->resize_width)/$ratio, $this->width, $this->height);
            ImageJpeg ($newimg,$this->dstimg,$qu);
        }
        elseif($ratio<$resize_ratio)
        {
            $newimg = imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height);
            imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, ($this->resize_height)*$ratio, $this->resize_height, $this->width, $this->height);
            ImageJpeg ($newimg,$this->dstimg,$qu);
        }
    }
}
function initi_img()
{
    if($this->type=="jpg")
    {
        if (!$this->im = imagecreatefromjpeg($this->srcimg))
            die('This is not a pic:'.$this->srcimg);
    }
    if($this->type=="gif")
    {
        if (!$this->im = imagecreatefromgif($this->srcimg))
            die('This is not a pic:'.$this->srcimg);
    }
    if($this->type=="png")
    {
        if (!$this->im = imagecreatefrompng($this->srcimg))
            die('This is not a pic:'.$this->srcimg);
    }
}
function dst_img($target)
{
    $full_length  = strlen($this->srcimg);
    $type_length  = strlen($this->type);
    $name_length  = $full_length-$type_length;
    $name         = substr($this->srcimg,0,$name_length-1);
    $this->dstimg = $target.".".$this->type;
}

function type() {
    return $this->type;
}}

please give suggestion

you can use the gif resizer class that i wrote with some modifications i think. The first mod you need to do is to keep the frames in the temp directory, because my script deletes them after it resizes the gif. Second, the animation may contain disposal method that when you split the animation to frames, you'd get just the difference of the image relative to the first frame. and you should merge the images first when you want the real (complete) frame.

here's the script url .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM