🙂 Я нашел эту 1 строку кода в другом посте, который успешно сжимает изображение с помощью pngquant. Дело в том, что он выводит оптимизированное изображение с другим именем (очевидно, чтобы сохранить оригинал).
я пытаюсь найти способ:
а) добавить минимальный параметр качества 60
b) использовать оператор if / else, чтобы позволить пользователю выбрать перезапись существующего файла или вывести новое оптимизированное изображение (с указанным пользователем именем)
благодарю вас! нтлри — не долго читать
<?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);
}
?>
из документов эта программа :
Имя выходного файла совпадает с именем ввода, за исключением того, что \ n \ it
оканчивается на \ «- fs8.png \», \ «- or8.png \» или на ваше собственное расширение
Итак, по этому вопросу:
// 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
, так что вы можете переименовать файл, который будет создан с этим суффиксом, ИЛИ ЖЕ просто установите --ext
возможность: .png
и это добавится к исходному файлу
--ext=.png
для более подробной информации, проверьте хранилище
я говорил с порнелом, чей это парнишка развил pngquant. это на самом деле намного проще, чем все, что я написал раньше …
! важно — очень важно использовать 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;
}