如何防止 imagecreatefrom 创建静态 gif - PHP

Posted

技术标签:

【中文标题】如何防止 imagecreatefrom 创建静态 gif - PHP【英文标题】:how to prevent imagecreatefrom from creating a static gif - PHP 【发布时间】:2021-07-13 04:11:27 【问题描述】:

我有一个发送图像的脚本,它被保存为 .gif 文件,如下面列出的 movie.php 文件中所声明的那样。 但是,据我了解,它会从 gif 创建图像,使其无法显示,因为它只是变成了静态图像 .gif。 反正 我想知道如何上传此文件并忽略此功能(imagecreatefromgif)我尝试以多种方式更改它,当我删除它时出现错误,有人可以帮助我解决这个问题,以便发送 gif 和不会被转换成静态的 gif 文件。基本上我希望我发送 gif 的方式只能用函数 imageGenerateName () 重命名,但它会保留它的所有大小和属性。 欢迎任何帮助。 提前致谢 . Movie.php 代码:

<?php

  class Movie 

    public function imageGenerateName() 
      return bin2hex(random_bytes(60)) . ".gif";
    

  

movie-process.php 代码

<?php
          // Upload  img
          if(isset($_FILES["image"]) && !empty($_FILES["image"]["tmp_name"])) 
    
            $image = $_FILES["image"];
            $imageTypes = ["image/gif"];
            $jpgArray = ["image/gif"];
    
            // Check img type
            if(in_array($image["type"], $imageTypes)) 
    
              // Check img type
              if(in_array($image["type"], $jpgArray)) 
                $imageFile = imagecreatefromgif($image["tmp_name"]);
               else 
                $imageFile = imagecreatefromgif($image["tmp_name"]);
                 
              // image name
              $imageName = $movie->imageGenerateName();
    
              imagegif($imageFile, "./img/movies/" . $imageName, 100);
    
              $movie->image = $imageName;
    
             
            
              // Upload img
              if(isset($_FILES["image"]) && !empty($_FILES["image"]["tmp_name"])) 
    
                $image = $_FILES["image"];
                $imageTypes = ["image/gif"];
                $jpgArray = ["image/gif"];
    
                // Check img type
                if(in_array($image["type"], $imageTypes)) 
    
                  // check type is gif
                  if(in_array($image["type"], $jpgArray)) 
                    $imageFile = imagecreatefromgif($image["tmp_name"]);
                  
    
                  // generete img name
                  $movie = new Movie();
    
                  $imageName = $movie->imageGenerateName();
    
                  imagegif($imageFile, "./img/movies/" . $imageName, 100);
    
                  $movieData->image = $imageName;   
                
               

【问题讨论】:

【参考方案1】:

不幸的是,imagecreatefromgif 函数只会读取 gif 的第一张图片,正如 PHP manual 所说的那样。

我之前尝试过解决这个问题,但除了上传图像而不触摸它之外没有任何转机。 PHP 使用GD library,并且这个库没有适当的功能来处理 gif 图像,而只是使用 *.gif 扩展名保存图像。

所以,这是我建议的解决方案:

// generete img name
$movie = new Movie();
$imageName = $movie->imageGenerateName();
move_uploaded_file($_FILES["image"]["tmp_name"],"./img/movies/" . $imageName);
$movieData->image = $imageName; 

【讨论】:

【参考方案2】:

我想既然你说你只是想按原样保存它,具有相同的大小和所有属性,你可以使用下面的代码

<?php

    $allowed = array('gif');
    $filename = $_FILES["image"]['name'];
    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    if (in_array($ext, $allowed)) 
    
                    // generete img name
                    $movie = new Movie();
                    $imageName = $movie->imageGenerateName();

          $uploadResult = move_uploaded_file($_FILES['image']['tmp_name'], dirname( dirname( __FILE__ ) ).'/img/movies/'. $imageName );
                    
            if($uploadResult === true )
                    $movie->image = $imageName;    
            else
                throw new \Exception('Unable to copy file to the given path');
            
    

或者,如果您可以访问 Imagick lib php 扩展,请参阅以下链接了解如何安装此 php-extension

https://www.php.net/manual/en/imagick.setup.php

然后使用该库中的函数即可

<?php 

        $allowed = array('gif');
        $filename = $_FILES["image"]['name'];
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
        if (in_array($ext, $allowed)) 

$image = new Imagick(); 
$image->readImage($_FILES["image"]["tmp_name"]);

$image = $image->coalesceImages(); 

foreach ($image as $frame)  
  $frame->cropImage($crop_w, $crop_h, $crop_x, $crop_y); 
  $frame->thumbnailImage($size_w, $size_h); 
  $frame->setImagePage($size_w, $size_h, 0, 0); 
 

$image = $image->deconstructImages(); 
$image->writeImages(dirname( dirname( __FILE__ ) ).'/img/movies/'. $imageName, true); 


?>

【讨论】:

以上是关于如何防止 imagecreatefrom 创建静态 gif - PHP的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS:如何防止浏览器缓存静态文件?

防止静态初始化命令“惨败”,C++

如何防止静态控件中的文本被剪切?

如何防止我的makefile由于静态库而重新链接

如何防止静态资源被映射在 /* 上的前端控制器 servlet 处理

如何防止 IIS 7.5 缓存符号链接内容?