:)我在另一篇文章中找到了这一行代码,它使用pngquant成功压缩了图像。问题是,它输出具有不同名称的优化图像(显然是为了保留原始图像)。
我试图找到一种方法:
a)添加最低质量参数60 b)使用if / else语句允许用户选择覆盖现有文件或输出新的优化图像(用户指定名称)
谢谢你! ntlri - 不要长时间阅读<?php system('pngquant --quality=85 image.png'); ?>
所以我试过的是以下...由于某种原因,单引号需要双引号来正确解析变量..
<?php
$min_quality = 60; $max_quality = 85;
$keep_original = 'dont_keep';
if ($keep_original == 'keep') {
$image_name = 'image.png';
$path_to_image = 'images/' . $image_name;
$new_file = 'image2.png';
$path_to_new_image = 'images/' . $new_file;
// don't know how to output to specified $new_file name
system("pngquant --quality=$min_quality-$max_quality $path_to_image");
} else {
$image_name = 'image.png';
$path_to_image = 'images/' . $image_name;
// don't know if you can overwrite file by same name as additional parameter
system("pngquant --quality=$min_quality-$max_quality $path_to_image");
// dont't know how you get the name of the new optimised image
$optimised_image = 'images/' . $whatever_the_optimised_image_is_called;
rename($optimised_image, $image_name);
unlink($optimised_image);
}
?>
答案 0 :(得分:1)
来自this program的文档:
输出文件名与输入名称相同,但\ n \ it除外 结束于\&#34; -fs8.png \&#34;,\&#34; -or8.png \&#34;或您的自定义扩展程序
所以,对于这个问题:
// don't know how to output to specified $new_file name system("pngquant --quality=$min_quality-$max_quality $path_to_image");
选择新名称,假设您压缩图片name.png
:
--ext=_x.png
这将创建一个名为name_x.png
所以,你的$new_file
只是一个后缀,
$new_file = '_x.png'; // to choose new file name name_x.png
//不知道您是否可以使用与其他名称相同的名称覆盖文件 参数
如程序文档中所述,新文件名后缀为-fs8.png
或-or8.png
,因此您可以重命名使用此后缀生成的文件 OR 只需将--ext
选项设置为:.png
,这将附加到原始文件
--ext=.png
有关详情,请查看the repository
答案 1 :(得分:1)
我和那些发展了pongquant的chappie的pornel谈过。它实际上比我之前写的所有内容简单得多......
!重要的是 - 使用escapeshellarg()非常重要,否则人们可以通过上传具有特殊文件名的文件来接管您的服务器。
$image_name = 'image.png';
$target_file = 'images/' . $image_name;
$existing_image = 'image.png'; // image already on server if applicable
$keep = 'keep';
$target_escaped = escapeshellarg($target_file);
if ($keep == 'keep') {
// process/change output file to image_compressed.png keeping both images
system("pngquant --force --quality=70 $target_escaped --ext=_compressed.png");
$remove_ext = substr($newFileName, 0 , (strrpos($newFileName, ".")));
// $new_image is just the name (image_compressed.png) if you need it
$new_image = $remove_ext . '_compressed.png';
// remove old file if different name
if ($existing_image != $newFileName) {
$removeOld = '../images/' . $existing_image;
unlink($removeOld);
} // comment out if you want to keep existing file
} else {
// overwrite if file has the same name
system("pngquant --force --quality=70 $target_escaped --ext=.png");
// remove old file if different name
if ($existing_image != $newFileName) {
$removeOld = '../images/' . $existing_image;
unlink($removeOld);
}
$new_image = $newFileName;
}