我有一个PHP脚本,用户可以上传图像。 如果文件大小大于'X'kbytes,我想让脚本降低图像质量(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:我不想改变图像的宽度和高度。
答案 0 :(得分:3)
当然可以。做这样的事。
$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']);
}
这将接受PHP GD支持的任何图像格式(假设它已安装在您的服务器上。很可能是)。如果图像小于限制,它只会将原始图像上传到您指定的路径。
答案 1 :(得分:3)
您的基本方法(在奥斯汀的答案中实施)会在某些时候有效,但请记住质量!=文件大小非常重要。虽然它们通常是相关的,但完全可能(甚至常见)降低jpeg文件的质量实际上会导致LARGER文件。这是因为上传到您系统的任何JPEG都已经通过JPEG压缩公式运行(通常质量为79或80)。根据原始图像,此过程将创建工件/更改生成的图像。当你第二次通过jpeg压缩算法运行这个已经优化的图像时,它不知道"知道"原始图像看起来像什么...所以它将传入的jpeg视为一个全新的无损文件,并尝试尽可能地复制它...包括在原始过程中创建的任何工件。再加上原始的jpeg压缩已经充分利用了大多数" easy"压缩技巧,最终很可能第二次压缩导致看起来更复杂的图像(复制问题的副本),但不是更小的文件。
我做了一些测试,看看截止的位置,并且毫不奇怪,如果原始图像具有低压缩比(q = 99),则节省了大量空间,重新压缩到q = 75。如果原始文件在q = 75时压缩(图形程序默认值很常见),则辅助q = 75压缩看起来更糟,但实际上与原始文件大小相同。如果原件具有较低的压缩等级(q = 50),则次要q = 75压缩导致显着更大的文件(对于这些测试,我使用了三张复杂的照片......显然具有特定口音/成分的图像将具有不同的性能通过这些压缩)。 注意:我使用Fireworks cs4进行此测试...我意识到这些quality indicators have no standardization between platforms
如下面的评论中所述,从PNG等文件格式转换为JPEG通常会显着缩小(尽管没有任何透明度),但是从JPEG - > JPEG(或GIF-> JPEG,特别是对于简单或小腭图像)通常无济于事。
无论如何,您仍然可以尝试使用Austin描述的压缩方法,但请确保在完成后比较两个图像的文件大小。如果只有很小的增量增益或新文件较大,则默认返回原始图像。