Простой скрипт для сжатия изображений с pngquant

🙂 Я нашел эту 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);
}

?>

1

Решение

из документов эта программа :

Имя выходного файла совпадает с именем ввода, за исключением того, что \ 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

для более подробной информации, проверьте хранилище

1

Другие решения

я говорил с порнелом, чей это парнишка развил 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;
}
1

По вопросам рекламы [email protected]