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

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

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

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

我该怎么做?

【问题讨论】:

标签: php image upload png exif


【解决方案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';
        }       
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 2011-03-21
      • 2012-01-24
      • 2013-07-07
      • 2010-10-19
      • 2012-01-25
      • 1970-01-01
      • 2012-12-21
      • 2012-09-15
      • 2012-06-01
      相关资源
      最近更新 更多