Как использовать pngquant для сжатия файлов JPEG на сервере Ubuntu с помощью переполнения стека

Я пытаюсь использовать pngquant для сжатия изображений (jpeg и png) при загрузке на мой сервер. Скрипт, который я получил с сайта pngquant, отлично работает для файлов png, но не для файлов jpeg. Я использую этот код (который работает для файлов PNG):

function compress_png($path_to_png_file, $max_quality = 90)
{
if (!file_exists($path_to_png_file)) {
throw new Exception("File does not exist: $path_to_png_file");
}

// guarantee that quality won't be worse than that.
$min_quality = 60;

// '-' makes it use stdout, required to save to $compressed_png_content variable
// '<' makes it read from the given file path
// escapeshellarg() makes this safe to use with any path
$compressed_png_content = shell_exec("pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg(    $path_to_png_file));

if (!$compressed_png_content) {
throw new Exception("Conversion to compressed PNG failed. Is pngquant 1.8+ installed on the server?");
}

return $compressed_png_content;
}

/****************************************************/$download_url = "https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png";// maximum execution time in seconds
set_time_limit (24 * 60 * 60);

// folder to save downloaded files to. must end with slash
$destination_folder = '/IMAGES/';

$ImageName = "testing_pngquant_image3.png";
$CompressedImageName = "testing_pngquant_image_compressed3.png";

$url = $download_url;
$newfname = $destination_folder . $ImageName;

$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");

if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}

if ($file) {
fclose($file);
}

if ($newf) {
fclose($newf);
}$path_to_uncompressed_file = $newfname;
$path_to_compressed_file = $destination_folder . $CompressedImageName;

// this will ensure that $path_to_compressed_file points to compressed file
// and avoid re-compressing if it's been done already
if (!file_exists($path_to_compressed_file)) {
file_put_contents($path_to_compressed_file, compress_png($path_to_uncompressed_file));
}

// and now, for example, you can output the compressed file:
header("Content-Type: image/png");
header('Content-Length: '.filesize($path_to_compressed_file));
readfile($path_to_compressed_file);
?>

Можно ли вообще использовать pngquant для файлов jpeg? Или есть какой-нибудь лучший (бесплатный) инструмент для сжатия файлов jpeg (например, jpegmini, который оплачивается), чтобы сделать это на моем сервере Ubuntu с помощью php.

0

Решение

Я уверен, что pngquant предназначен только для файлов PNG. Существует ряд подобных утилит для использования на JPG. Возможно, вы захотите использовать только существующий скрипт imgopt (скрипт оболочки bash). Он расположен здесь: imgopt

Этот скрипт хорошо работает (как JPG, так и PNG) и очень прост в использовании. Это абсолютно без потерь, так что это довольно безопасно, но вы можете добавить туда pngquant, если хотите (pngquant с потерями). Есть несколько обязательных программ, которые необходимо установить в первую очередь, и один двоичный файл, если вы решили его использовать (pngout).

Я не писал сценарий, я просто использовал его в течение достаточно долгого времени.

0

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

Как я знаю, Pngquant используется для сжатия формата PNG с потерями. Для JPEG вы можете использовать фактор качества при выводе.

0

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