13

我有脚本:

<?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;
}

?>

是否可以将所有图像(png、gif 等)转换为 100% 质量的 jpg?如果是,如何?我想允许上传 png 和 gif,但这个脚本应该将此文件转换为 jpg。用PHP可以吗?

4

6 回答 6

48

试试这个代码: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;
}
于 2013-01-27T16:49:39.290 回答
11

尝试使用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(); 
于 2013-01-27T16:37:30.470 回答
7

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;
}

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

于 2017-10-23T16:45:41.110 回答
3

转换image.pngimage.jpg所需图像质量的小代码:

<?php
$image = imagecreatefrompng('image.png');
imagejpeg($image, 'image.jpg', 70); // 0 = worst / smaller file, 100 = better / bigger file 
imagedestroy($image);
?>
于 2016-08-11T06:45:50.550 回答
1

对大卫的回答的一个小修复,从 BMP 转换的正确函数是“imagecreatefrom w bmp”而不是 imagecreatefrombmp(缺少“w”)你应该考虑到 png 可能是透明的,这是一种用白色 BG 填充它的方法( jpeg 不能应用 alpha 数据)。

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=imagecreatefromwbmp($originalImage);}
else    {    return false;}
// quality is a value from 0 (worst) to 100 (best)
imagejpeg($imageTmp, $outputImage, $quality);
imagedestroy($imageTmp);
return true;
}
于 2016-06-07T13:11:52.690 回答
0

来自 PhpTools:

/**
 * @param string $source (accepted jpg, gif & png filenames)
 * @param string $destination
 * @param int $quality [0-100]
 * @throws \Exception
 */
public function convertToJpeg($source, $destination, $quality = 100) {

    if ($quality < 0 || $quality > 100) {
        throw new \Exception("Param 'quality' out of range.");
    }

    if (!file_exists($source)) {
        throw new \Exception("Image file not found.");
    }

    $ext = pathinfo($source, PATHINFO_EXTENSION);

    if (preg_match('/jpg|jpeg/i', $ext)) {
        $image = imagecreatefromjpeg($source);
    } else if (preg_match('/png/i', $ext)) {
        $image = imagecreatefrompng($source);
    } else if (preg_match('/gif/i', $ext)) {
        $image = imagecreatefromgif($source);
    } else {
        throw new \Exception("Image isn't recognized.");
    }

    $result = imagejpeg($image, $destination, $quality);

    if (!$result) {
        throw new \Exception("Saving to file exception.");
    }

    imagedestroy($image);
}
于 2017-04-26T16:43:56.370 回答