2016-04-12 24 views
5

Próbuję użyć algorytmu kompresji pngquant do kompresowania obrazów PNG w locie za pomocą WAMP. Zapewniają one PHP example, która (jak sądzę) ma używać command line binary for Windows, którą umieściłem w folderze system32 i mogę uzyskać dostęp z dowolnego miejsca w linii poleceń.Przykład PHP pngquant nie działa

Wziąłem ich przykład i prześledziłem problem do linii $compressed_png_content = shell_exec("pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg( $path_to_png_file));. Uprośniłem go do var_dump(shell_exec('pngquant - < test.png'));, ale wyprowadza on tylko pierwszych 5 znaków, mimo że wydaje się, że passthru('pngquant - < test.png'); wysyła prawidłowe ciągi do użytkownika. exec('pngquant - < test.png',$output); var_dump($output); wydaje się również przechwytywać prawidłowy wynik, ale w postaci tablicy, której tak naprawdę nie wiem, jak przekonwertować z powrotem do pliku obrazu. Chcę przechwycić dane wyjściowe w zmiennej, aby móc użyć dalszych algorytmów kompresji i manipulacji i wysłać je do użytkownika jako plik do pobrania.

Przeczytałem na diferences between system() vs exec() vs shell_exec() vs passthru() vs proc_open() vs popen(). Powłoka Shell_exec() wydaje się być właściwym wyborem, jednak na stronie php.net jest napisane, że shell_exec()'s wysyła ciąg znaków. Czy to może być problem? Jak poprawnie przechwycić dane wyjściowe polecenia polecenia pngquant - < test.png do zmiennej?

+0

Po prostu mówiąc, obrazy PNG są już mocno skompresowane. Ale wciąż, ponownie przypisane pytanie +1. – Xorifelse

+0

Jestem projektantem stron internetowych. Większość moich PNG i innych PNG projektantów, z którymi pracuję, może być skompresowana o 40% do 70% bez widocznego pogorszenia jakości przy użyciu tego algorytmu. Myślę, że to jest tego warte :) –

+0

Czy znalazłeś rozwiązanie? – sanjihan

Odpowiedz

0

prawo tekst: "pngquant --quality = $ min_quality- $ max_quality" .escapeshellarg ($ path_to_png_file)

+0

To nie wyprowadza zawartości kompresji do zmiennej. Po prostu tworzy nowy plik na dysku. –

2

Użyj owijkę PHP (php-pngquant) dla PNGQuant zamiast Natknąłem się w tej samej sprawie, a to nieoficjalne opakowanie ostatecznie mnie uratowało.

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

Dzięki dexterb. Rzucę okiem na to, jak dokładnie to opakowanie obsługuje surowe wyjście :) –