在 PHP 中将 JPG/GIF 图像转换为 PNG?

Posted

技术标签:

【中文标题】在 PHP 中将 JPG/GIF 图像转换为 PNG?【英文标题】:Convert JPG/GIF image to PNG in PHP? 【发布时间】:2012-01-22 21:58:04 【问题描述】:

可能重复Convert jpg image to gif, png & bmp format using php

我有一个 PHP 表单,允许上传图片并检查 exif_imagetype(); 以确保图片有效。

但是,我希望所有格式(PNG、JPG、JPEG 和 GIF)在提交后最终都是 PNG。

我该怎么做?

【问题讨论】:

***.com/questions/755781/… Convert jpg image to gif, png & bmp format using PHP的可能重复 【参考方案1】:

使用gd functions 非常简单:

switch (exif_imagetype($image)) 
    case IMAGETYPE_GIF :
        $img = imagecreatefromgif($image);
        break;
    case IMAGETYPE_JPEG :
        $img = imagecreatefromjpeg($image);
        break;
    default :
        throw new InvalidArgumentException('Invalid image type');


imagepng($img, $filename);

为了简洁起见,如果图像已经是 PNG,这显然不能处理这种情况。

【讨论】:

【参考方案2】:

那么你只需要imagepng()。事实上,它几乎变成了一条线:

 imagepng(imagecreatefromstring(file_get_contents($filename)), "output.png");

您将使用$_FILES["id"]["tmp_name"] 作为文件名,并且显然使用不同的输出文件名。但是图像格式探测本身就会变得多余。

【讨论】:

这非常有效。我只是将 output.png 更改为“uploads/out.png”来移动目录。 但我想知道这是否破坏了临时文件?还是我需要运行imagedestroy() 来删除临时文件? 在这个例子中,你不能使用imagedestroy,因为它需要一个句柄(如果你使用两行代码就可以得到)。脚本结束时,上传的临时文件将自动删除。 如果我将 jpg 转换为 png,图像质量会受到影响吗?我知道 gif 和 png 支持相同的颜色类型,但 jpg 支持更多。 @issueNo329 如果您的输入是 JPEG,那么它已经有 压缩工件。将其转换为 PNG 不会使这些恶化,但不会很好地压缩。 (请记住,PNG 用于纯色图形,JPEG 用于柔软的照片。)【参考方案3】:

你可以根据图片的类型选择正确的函数来打开文件:

$extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); 
switch ($extension) 
    case 'jpg':
    case 'jpeg':
       $image = imagecreatefromjpeg($filename);
    break;
    case 'gif':
       $image = imagecreatefromgif($filename);
    break;
    case 'png':
       $image = imagecreatefrompng($filename);
    break;

然后您只需使用以下命令保存文件:

imagepng($image, $new_filename, $quality);

可能值得注意的是,这只会解析实际的扩展名而不会真正验证,因此文件是特定格式的。例如,您可以拍摄 jpg 图像并将扩展名更改为 png。 所以更好的方法是使用exif_imagetype(),它将返回图像的类型,而不取决于实际的扩展名。

【讨论】:

图片转换成.ico文件怎么样? 格式错误的 UTF-8 字符,可能是我得到的错误编码错误(物理路径和 url)。 @pankajkumar 你在说什么?【参考方案4】:
<form method="post" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" name="submit" value="Submit" />
</form>

<?php
if(isset($_POST['submit']))

    if(exif_imagetype($_FILES['image']['tmp_name']) ==  IMAGETYPE_GIF) 
    
        $newpng = 'image.png';
        $png = imagepng(imagecreatefromgif($_FILES['image']['tmp_name']), $newpng);
    
    elseif(exif_imagetype($_FILES['image']['tmp_name']) ==  IMAGETYPE_JPEG) 
    
        $newpng = 'image.png';
        $png = imagepng(imagecreatefromjpeg($_FILES['image']['tmp_name']), $newpng);
    
    else //already png
    
        $newpng = 'image.png';
           

?>

【讨论】:

以上是关于在 PHP 中将 JPG/GIF 图像转换为 PNG?的主要内容,如果未能解决你的问题,请参考以下文章

将不同的图片格式(jpg、gif、png等)转换为TIFF格式

在没有 shell 的 PHP 中将 HTML 转换为图像

如何在 PHP 中将图像从 base 64 转换为它们的文件类型?

在 Python 3.9.6 中将 b 字符串转换为 png

图片的四种格式.jpg、.gif、.png、.bmp各是啥意思?

php imagecopyresampled - 保存后图像为空(全黑)