如何防止 imagecreatefrom 创建静态 gif - PHP
how to prevent imagecreatefrom from creating a static gif - PHP
我有一个发送图像的脚本,该图像被保存为 .gif,如下面列出的 movie.php 文件中声明的那样。
但是,据我了解,它会从 gif 创建图像,使其无法显示,因为它只是变成了静态图像 .gif。
反正
我想知道如何上传这个文件并忽略这个函数(imagecreatefromgif)不能转换为静态的 gif 文件。基本上我希望我发送 gif 的方式只会用函数 imageGenerateName () 重命名,但它会保持其所有大小和 属性。
欢迎任何帮助。
提前致谢
.
Movie.php代码:
<?php
class Movie {
public function imageGenerateName() {
return bin2hex(random_bytes(60)) . ".gif";
}
}
电影-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;
}
}
不幸的是,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;
我想既然你说你只想按原样保存它,具有相同的大小和所有属性,你可以使用下面的代码
<?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 库 php 扩展,请参阅下面 link 如何安装此 php-扩展
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);
}
?>
我有一个发送图像的脚本,该图像被保存为 .gif,如下面列出的 movie.php 文件中声明的那样。 但是,据我了解,它会从 gif 创建图像,使其无法显示,因为它只是变成了静态图像 .gif。 反正 我想知道如何上传这个文件并忽略这个函数(imagecreatefromgif)不能转换为静态的 gif 文件。基本上我希望我发送 gif 的方式只会用函数 imageGenerateName () 重命名,但它会保持其所有大小和 属性。 欢迎任何帮助。 提前致谢 . Movie.php代码:
<?php
class Movie {
public function imageGenerateName() {
return bin2hex(random_bytes(60)) . ".gif";
}
}
电影-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;
}
}
不幸的是,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;
我想既然你说你只想按原样保存它,具有相同的大小和所有属性,你可以使用下面的代码
<?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 库 php 扩展,请参阅下面 link 如何安装此 php-扩展
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);
}
?>