Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将所有图像转换为jpg?_Php_Image Processing - Fatal编程技术网

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

Php 如何将所有图像转换为jpg?,php,image-processing,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 = $_FIL

我有剧本:

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

?>

尝试使用
Imagick
setImageFormat
,它为我提供了最好的图像质量


请尝试以下代码:
originalImage
是。。。原始图像<代码>输出图像
可以自我解释<代码>质量是一个从0到100的数字,用于设置输出jpg质量(0-最差,100-最佳)


对于davide的答案,一个小的修正,从BMP转换的正确函数是“imagecreatefromwBMP”,而不是imagecreatefrombmp(缺少“w”) 你也应该考虑PNG可能是透明的,一种用白色BG填充它的方法(JPEG不能应用alpha数据)。p>
以所需图像质量将
image.png
转换为
image.jpg
的小代码:

<?php
$image = imagecreatefrompng('image.png');
imagejpeg($image, 'image.jpg', 70); // 0 = worst / smaller file, 100 = better / bigger file 
imagedestroy($image);
?>

来自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);
}
/**
*@param string$source(可接受的jpg、gif和png文件名)
*@param string$destination
*@param int$quality[0-100]
*@throws\Exception
*/
公共函数convertToJpeg($source,$destination,$quality=100){
如果($quality<0 | |$quality>100){
抛出新\异常(“参数“质量”超出范围。”);
}
如果(!file_存在($source)){
抛出new\Exception(“未找到图像文件”);
}
$ext=pathinfo($source,pathinfo\u扩展名);
if(preg_match('/jpg | jpeg/i',$ext)){
$image=imagecreatefromjpeg($source);
}else if(preg_匹配('/png/i',$ext)){
$image=imagecreatefrompng($source);
}else if(preg_匹配('/gif/i',$ext)){
$image=imagecreatefromformgif($source);
}否则{
抛出new\Exception(“无法识别图像”);
}
$result=imagejpeg($image,$destination,$quality);
如果(!$result){
抛出new\Exception(“保存到文件异常”);
}
图像销毁($图像);
}

Davide Berra的答案很好,因此我稍微改进了文件类型检测,使用exif\u 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\u exif扩展才能使用它。

看看这个讨论,它已经得到了回答[使用php将PNG转换为JPG并进行压缩?][1][1]:关于将png转换为jqg@davideberra调用此函数而不是移动上传的文件使用$ext==“png”之类的函数而不是preg\u match-它也可以工作,速度稍快一些。此外,在检查之前,我在$ext上使用strtolower来正确处理.JPG之类的扩展。另外,卓越的功能,对我帮助很大+1 preg_match中的/i使检查不区分大小写。有人可能会认为将$_文件['photoimg']['tmp_name']作为$originalImage传递是可行的,但它碰巧将文件另存为XXXXX.tmp,因此扩展名不起作用。相反,传递$_文件['photoimg']['name']将提供正确的扩展名,但无法创建映像(它得到的是一个字符串而不是一个对象。所以要解决这个问题,你可以同时传递信息、$originalImage和$originalName并相应地编辑函数,除此之外,非常感谢Davide为我使用多年的伟大函数。我会在每个注册模式的末尾添加$sign。为什么?上传的名为:iAmjpegWithGifAnd的文件呢PngTypedInName.bmp.美元符号将确保模式中匹配的扩展名后没有任何内容
<?php
$image = imagecreatefrompng('image.png');
imagejpeg($image, 'image.jpg', 70); // 0 = worst / smaller file, 100 = better / bigger file 
imagedestroy($image);
?>
/**
 * @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);
}
/**
*   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;
}