如何将所有图像转换为jpg?

Ste*_*oor 9 php image-processing

我有脚本:

<?php

include('db.php');
session_start();
$session_id = '1'; // User session id
$path = "uploads/";

$valid_formats = array("jpg", "png", "gif", "bmp", "jpeg");
if (isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") {
    $name = $_FILES['photoimg']['name'];
    $size = $_FILES['photoimg']['size'];
    if (strlen($name)) {
        list($txt, $ext) = explode(".", $name);
        if (in_array($ext, $valid_formats)) {
            if ($size < (1024 * 1024)) { // Image size max 1 MB
                $actual_image_name = time() . $session_id . "." . $ext;
                $tmp = $_FILES['photoimg']['tmp_name'];
                if (move_uploaded_file($tmp, $path . $actual_image_name)) {
                    mysql_query("UPDATE users SET profile_image='$actual_image_name' WHERE uid='$session_id'");
                    echo "<img src='uploads/" . $actual_image_name . "' class='preview'>";
                } else {
                    echo "failed";
                }
            } else {
                echo "Image file size max 1 MB";
            }
        } else {
            echo "Invalid file format..";
        }
    } else {
        echo "Please select image..!";
    }
    exit;
}

?>
Run Code Online (Sandbox Code Playgroud)

可以将所有图像(png,gif等)转换为100%质量的jpg吗?如果有,怎么样?我想允许上传png和gif,但是这个脚本应该将这些文件转换为jpg.有可能这与PHP?

Dav*_*rra 39

试试这段代码:originalImage原始图像的路径...... outputImage是自我解释的.Quality是一个从0到100的数字设置输出jpg质量(0 - 最差,100 - 最好)

function convertImage($originalImage, $outputImage, $quality)
{
    // jpg, png, gif or bmp?
    $exploded = explode('.',$originalImage);
    $ext = $exploded[count($exploded) - 1]; 

    if (preg_match('/jpg|jpeg/i',$ext))
        $imageTmp=imagecreatefromjpeg($originalImage);
    else if (preg_match('/png/i',$ext))
        $imageTmp=imagecreatefrompng($originalImage);
    else if (preg_match('/gif/i',$ext))
        $imageTmp=imagecreatefromgif($originalImage);
    else if (preg_match('/bmp/i',$ext))
        $imageTmp=imagecreatefrombmp($originalImage);
    else
        return 0;

    // quality is a value from 0 (worst) to 100 (best)
    imagejpeg($imageTmp, $outputImage, $quality);
    imagedestroy($imageTmp);

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

  • 人们可能会认为将 $_FILES['photoimg']['tmp_name'] 作为 $originalImage 传递是可行的,但它恰好将文件保存为 XXXXX.tmp,因此扩展名不起作用。传递 $_FILES['photoimg']['name'] 将给出正确的扩展名,但无法创建图像(它获取的是字符串而不是对象。因此,为了解决这个问题,您可以传递 info、$originalImage 和$originalName 并相应地编辑函数,除此之外,非常感谢 Davide,我已经使用了多年的出色函数 (3认同)
  • 使用$ ext =='png'而不是preg_match - 它也有效,而且速度稍快.另外,我在检查前在$ ext上使用strtolower来正确处理像.JPG这样的扩展.否则,优秀的功能,帮助了我很多.+1 (2认同)

chi*_*l0r 9

尝试使用Imagick setImageFormat,对我来说它提供了最好的图像质量
http://php.net/manual/en/imagick.setimageformat.php

$im = new imagick($image);

// convert to png
$im->setImageFormat('png');

//write image on server
$im->writeImage($image .".png");
$im->clear();
$im->destroy(); 
Run Code Online (Sandbox Code Playgroud)


Luc*_*nte 8

Davide Berra 的回答很好,所以我稍微改进了文件类型检测,使用exif_imagetype()而不是依赖文件扩展名:

/**
*   Auxiliar function to convert images to JPG
*/
function convertImage($originalImage, $outputImage, $quality) {

    switch (exif_imagetype($originalImage)) {
        case IMAGETYPE_PNG:
            $imageTmp=imagecreatefrompng($originalImage);
            break;
        case IMAGETYPE_JPEG:
            $imageTmp=imagecreatefromjpeg($originalImage);
            break;
        case IMAGETYPE_GIF:
            $imageTmp=imagecreatefromgif($originalImage);
            break;
        case IMAGETYPE_BMP:
            $imageTmp=imagecreatefrombmp($originalImage);
            break;
        // Defaults to JPG
        default:
            $imageTmp=imagecreatefromjpeg($originalImage);
            break;
    }

    // quality is a value from 0 (worst) to 100 (best)
    imagejpeg($imageTmp, $outputImage, $quality);
    imagedestroy($imageTmp);

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

您必须启用php_exif扩展才能使用此功能。