2016-04-12 13 views
5

Sto cercando di utilizzare l'algoritmo di compressione pngquant per comprimere le immagini PNG al volo utilizzando WAMP. Forniscono un PHP example che (penso) dovrebbe utilizzare lo command line binary for Windows, che ho inserito nella cartella system32 e posso accedere da qualsiasi punto della riga di comando.esempio PHP pngquant non funziona

Ho preso il loro esempio e tracciato il problema alla linea $compressed_png_content = shell_exec("pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg( $path_to_png_file));. L'ho semplificato in var_dump(shell_exec('pngquant - < test.png')); ma emette solo i primi 5 caratteri anche se passthru('pngquant - < test.png'); sembra inviare l'output corretto all'utente come stringa. exec('pngquant - < test.png',$output); var_dump($output); sembra anche catturare l'output corretto ma in una forma di array, che non so davvero come convertire in un file immagine. Voglio acquisire l'output in una variabile in modo da poter utilizzare ulteriori algoritmi di compressione e manipolazioni e inviarlo all'utente come file scaricabile.

Ho letto su diferences between system() vs exec() vs shell_exec() vs passthru() vs proc_open() vs popen(). Shell_exec() sembra essere la scelta corretta, tuttavia su php.net si dice che shell_exec()'s emette una stringa. Potrebbe essere un problema? Come posso catturare correttamente l'output del comando pngquant - < test.png in una variabile?

+0

Solo dicendo, le immagini PNG sono già molto compresse. Ma ancora, una domanda riveduta +1. – Xorifelse

+0

Sono un web designer. La maggior parte dei miei PNG e dei PNG di altri designer con cui lavoro possono essere compressi dal 40% al 70% senza alcun deterioramento visivamente osservabile utilizzando questo algoritmo. Penso che ne valga la pena :) –

+0

Ti è venuta in mente una soluzione? – sanjihan

risposta

0

destra del testo: "pngquant --quality = $ min_quality- $ max_quality" .escapeshellarg ($ path_to_png_file)

+0

Ciò non restituisce il contenuto della compressione su una variabile. Crea solo un nuovo file sul disco. –

2

Utilizzare un wrapper PHP (php-pngquant) per pngquant invece, ho incontrato con lo stesso problema, e questo involucro non ufficiale mi ha finalmente salvato.

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]; 
    } 
} 
+0

Grazie a dexterb. Daremo un'occhiata a come, esattamente, questo wrapper gestisce l'output raw :) –