Я пытаюсь использовать pngquant алгоритм сжатия для сжатия изображений PNG на лету с использованием WAMP. Они обеспечивают Пример PHP что (я думаю) должен использовать двоичная командная строка для Windows, который я положил в system32
папка, и я могу получить доступ из любого места в командной строке.
Я взял их пример и проследил проблему $compressed_png_content = shell_exec("pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg( $path_to_png_file));
линия. Я упростил это до var_dump(shell_exec('pngquant - < test.png'));
но выводит только первые 5 символов, хотя passthru('pngquant - < test.png');
кажется, чтобы отправить правильный вывод пользователю в виде строки. exec('pngquant - < test.png',$output); var_dump($output);
также, кажется, захватывает правильный вывод, но в виде массива, который я действительно не знаю, как преобразовать обратно в файл изображения. Я хочу записать вывод в переменную, чтобы я мог использовать дополнительные алгоритмы сжатия и манипуляции и отправить его пользователю в виде загружаемого файла.
Я прочитал на Различия между system () и exec (), shell_exec (), passthru (), proc_open () и popen (). Shell_exec () кажется правильным выбором, однако на php.net говорится, что shell_exec () ‘ы выводит строку Может ли это быть проблемой? Как мне правильно запечатлеть pngquant - < test.png
вывод команды в переменную?
Использовать оболочку PHP (PHP-pngquant) вместо PNGQuant я столкнулся с той же проблемой, и эта неофициальная оболочка наконец спасла меня.
function compress_image($source_path, $destination_path, $quality){
$instance = new PNGQuant();
// Change the path to the binary of pngquant, for example in windows would be (with an example path):
$instance->setBinaryPath("E:\\wamp64\\www\\testing\\pngquant\\pngquant.exe")
// Other options of PNGQuant here
->execute();
// Set the path to the image to compress
$result = $instance->setImage($source_path)
// Overwrite output file if exists, otherwise pngquant will generate output ...
->overwriteExistingFile()
// As the quality in pngquant isn't fixed (it uses a range)
// set the minimum quality to 60
->setQuality(60, $quality)
// Retrieve RAW data from pngquant
->getRawOutput();
$exit_code = $result["statusCode"];// if exit code is equal to 0 then everything went right !
if($exit_code == 0){
$rawImage = imagecreatefromstring($result["imageData"]);
// Example Save the PNG Image from the raw data into a file or do whatever you want.
imagepng($rawImage , $destination_path);
echo "Image succesfully compressed, do something with the raw Data";
}else{
echo "Something went wrong (status code $exit_code) with description: ". $instance->getErrorTable()[(string) $exit_code];
}
}
правильный текст: «pngquant —force —ext .png —качество = $ min_quality- $ max_quality «.escapeshellarg ($ path_to_png_file)