Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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:在满足条件时更改图像质量?_Php - Fatal编程技术网

PHP:在满足条件时更改图像质量?

PHP:在满足条件时更改图像质量?,php,Php,我有一个php脚本,用户可以上传图像。 如果文件大小大于“X”KB,我想使脚本降低图像质量(jpeg) 大概是这样的: if( $_FILES['uploaded_img']['size'] > $file_size_limit ){ // code that lowers the quality of the uploaded image but keeps the image width and height } 最好的方法是什么 ps:我不想更改图像的宽度和高度。当然可以

我有一个php脚本,用户可以上传图像。 如果文件大小大于“X”KB,我想使脚本降低图像质量(jpeg)

大概是这样的:

if( $_FILES['uploaded_img']['size'] > $file_size_limit ){
     // code that lowers the quality of the uploaded image but keeps the image width and height
}
最好的方法是什么


ps:我不想更改图像的宽度和高度。

当然可以。像这样做

$upload = $_FILES['uploaded_img'];
$uploadPath = 'new/path/for/upload/';
$uploadName = pathinfo($upload['name'], PATHINFO_FILENAME);
$restrainedQuality = 75; //0 = lowest, 100 = highest. ~75 = default
$sizeLimit = 2000;

if($upload['size'] > $sizeLimit) {
    //open a stream for the uploaded image
    $streamHandle = @fopen($upload['tmp_name'], 'r');
    //create a image resource from the contents of the uploaded image
    $resource = imagecreatefromstring(stream_get_contents($streamHandle));

    if(!$resource)
        die('Something wrong with the upload!');

    //close our file stream
    @fclose($streamHandle);

    //move the uploaded file with a lesser quality
    imagejpeg($resource, $uploadPath . $uploadName . '.jpg', $restrainedQuality); 
    //delete the temporary upload
    @unlink($upload['tmp_name']);
} else {
    //the file size is less than the limit, just move the temp file into its appropriate directory
    move_uploaded_file($upload['tmp_name'], $uploadPath . $upload['name']);
}
这将接受PHPGD支持的任何图像格式(假设它安装在您的服务器上,很可能是)。如果图像小于限制,它只会将原始图像上传到您指定的路径。

您的基本方法(在Austin的回答中实现)会在某些时候起作用,但重要的是要记住,质量!=文件大小。虽然它们通常是相关的,但降低jpeg文件的质量实际上会导致文件变大是完全可能的(甚至是常见的)。这是因为上传到系统中的任何JPEG都已通过JPEG压缩公式(通常质量为79或80)运行。根据原始图像,此过程将创建瑕疵/改变结果图像。当您再次通过jpeg压缩算法运行此已优化的图像时,它不“知道”原始图像的样子。。。因此,它将传入的jpeg视为一个全新的无损文件,并尝试尽可能地复制它。。。包括在原始流程中创建的任何工件。再加上原来的jpeg压缩已经利用了大多数“简单”的压缩技巧,第二次压缩很可能会导致更糟糕的图像(复制问题的副本),而不是更小的文件

我做了一些测试,看看截止点在哪里,如果原始图像的压缩比很低(q=99),那么将大量空间重新压缩到q=75,这并不奇怪。如果原始文件被压缩为q=75(对于图形程序默认值来说非常常见),那么第二个q=75压缩看起来更糟,但导致的文件大小几乎与原始文件相同。如果原稿的压缩级别较低(q=50),那么第二次q=75压缩会产生一个大得多的文件(在这些测试中,我使用了三张复杂的照片…显然,具有特定腭部/成分的图像在这些压缩过程中会有不同的表现)。注意:我正在使用Fireworks cs4进行此测试。。。我意识到这些

正如下面的评论所指出的,从PNG这样的文件格式移动到JPEG通常会变得更小(虽然没有任何透明度),但从JPEG->JPEG(或GIF->JPEG,尤其是对于简单或小图像)通常没有帮助


无论如何,您仍然可以尝试使用Austin描述的压缩方法,但请确保完成后比较两个图像的文件大小。如果只有少量增量增益或新文件较大,则默认返回原始图像。

阅读图像功能:您可以使用
imagejpeg
以其他质量保存图像,但您不知道原始质量。是的,我想我无法分辨图像质量。这就是为什么我只在文件大小超过一定限制时才运行此代码的原因。哇,没想到这在PHP中会如此简单。谢谢,没问题。很高兴我能帮忙。我知道这与我的问题没有直接关系,但有必要“取消”临时文件的链接吗???服务器会自动为我做吗?是的,服务器会自动做。但是,当您可以选择执行该脚本时,为什么同时在服务器上有两个映像实例呢?该脚本看起来不错,只是它没有解决它试图解决的问题。原始图像可能太大,因为图像太大,在这种情况下,重新采样无法解决问题,甚至可能使问题恶化。最起码,在重新采样后,新的字节大小应该与原始字节大小进行比较,并且只有在更好的情况下才使用。好吧,我这里的唯一目标是防止用户上传繁重的图像文件,这是我找到的唯一解决方案,到目前为止,你对JPEG实例的看法是正确的,但是转换png->jpg通常会在大小上产生很大的差异。不仅如此,我还尝试将这段代码与具有透明背景的png一起使用,新的jpeg完全搞砸了。但这仍然比简单地告诉用户他们必须压缩图像而不做任何事情要好。是的,jpeg不支持透明度,但从PNG->jpeg移动通常会节省成本。。。只需确保您正在检查压缩结果,以确保它为您带来足够的节省,从而证明损失是合理的。