【问题标题】:Why won't GIF files stay animated?为什么 GIF 文件不能保持动画?
【发布时间】:2015-06-04 05:17:42
【问题描述】:

这个脚本上传一张图片,给它加水印,并创建一张图片的缩略图。我已经对其进行了编辑以忽略 GIF 文件的水印,因为 GD 库在加水印时会破坏动画。 它可以很好地为适当的图像类型加水印,但是当上传 GIF 时,即使没有加水印,它也不会保持动画状态。这是完整的代码:

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

}

我注意到如果我使用:

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

代替:

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

然后 GIF 将保持动画,但它不再为任何内容添加水印。我完全糊涂了。我对 PHP 的了解非常有限。有没有人有任何想法?谢谢。

【问题讨论】:

标签: php


【解决方案1】:

如果您希望 gif 图像具有动画效果,则不应将 GIF 图像转换为 jpg 或 png 类型

【讨论】:

  • 此代码 $watermark = imagecreatefrompng($watermark); 在 resizeImage 函数中。我认为你应该只对动画图像使用 GIF 类型的图像
猜你喜欢
  • 2012-04-28
  • 2018-11-12
  • 1970-01-01
  • 2015-05-21
  • 2013-08-28
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
相关资源
最近更新 更多