2016-04-12 27 views
5

WAMP kullanarak anında PNG görüntülerini sıkıştırmak için pngquant sıkıştırma algoritmasını kullanmaya çalışıyorum. PHP example sağlarlar (Bence) system32 klasörüne koyduğum command line binary for Windows'u kullanmalı ve komut satırında herhangi bir yerden erişebiliyorum.pngquant PHP örneği çalışmıyor

Örneklerini alıp sorunu $compressed_png_content = shell_exec("pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg( $path_to_png_file)); satırına kadar takip ettim. var_dump(shell_exec('pngquant - < test.png'));'a sadeleştirdim ancak passthru('pngquant - < test.png'); kullanıcısına bir dizge olarak doğru çıktıyı göndermesine rağmen sadece ilk 5 karakteri çıkarır. exec('pngquant - < test.png',$output); var_dump($output); da doğru çıktıyı yakalamak gibi görünüyor, ancak bir görüntü dosyasına nasıl dönüşeceğini gerçekten bilmiyorum bir dizi şeklinde. Çıktıyı bir değişkende yakalamak istiyorum, böylece daha fazla sıkıştırma algoritması ve manipülasyonu kullanabilir ve kullanıcıya indirilebilir bir dosya olarak gönderebilirim.

diferences between system() vs exec() vs shell_exec() vs passthru() vs proc_open() vs popen() numaralı telefonu okudum. Shell_exec() doğru seçim gibi görünüyor, ancak php.net üzerinde shell_exec()'s bir dizgi çıkardığını söylüyor. Bu bir sorun olabilir mi? pngquant - < test.png komut çıktısını bir değişkene doğru şekilde nasıl kaydederim?

+0

Sadece söyleyerek, PNG görüntüleri zaten çok sıkıştırılmış. Ama yine de, bir soru +1. – Xorifelse

+0

Ben bir web tasarımcısıyım. Çalıştığım PNG'lerim ve diğer tasarımcı PNG'lerinin çoğu, bu algoritma kullanılarak görsel olarak gözlenebilen bir bozulma olmaksızın% 40 ila% 70 oranında sıkıştırılabilir. Bence buna değdi :) –

+0

Bir çözüm buldunuz mu? – sanjihan

cevap

0

sağ metni: "pngquant --quality = $ min_quality- $ max_quality" .escapeshellarg ($ path_to_png_file)

+0

Bu, sıkıştırmanın içeriğini bir değişkene çıkarmaz. Sadece diskte yeni bir dosya oluşturur. –

2

, onun yerine, aynı sorunla ilgili rastladım PNGQuant için bir PHP sarmalayıcı (php-pngquant) kullanın ve bu resmi olmayan sarıcı sonunda beni kurtardı.

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

Teşekkürler dexterb. Tam olarak, bu sarıcı ham çıktıyı nasıl ele alacağına bir göz atacağım :) –