pngquant пример PHP не работает

Я пытаюсь использовать алгоритм сжатия 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 вывод команды в переменную?

2 ответа

Вместо этого используйте 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 --quality = $ min_quality- $ max_quality".escapeshellarg ($ path_to_png_file)

Другие вопросы по тегам