2017-03-26 1 views
1

:) J'ai trouvé cette 1 ligne de code dans un autre article qui compresse avec succès l'image en utilisant pngquant. La chose est, il sort l'image optimisée avec un nom différent (évidemment pour préserver l'original).PHP - Script simple pour la compression d'image avec pngquant

im essayant de trouver un moyen de:

a) ajouter un paramètre de qualité minimum de 60 b) utiliser une instruction if/else pour permettre à l'utilisateur de choisir de remplacer le fichier existant ou à la sortie d'une nouvelle image optimisée (d'un nom spécifié par l'utilisateur)

merci! ntlri - pas longtemps lire

<?php system('pngquant --quality=85 image.png'); ?> 

donc ce que j'ai essayé est le suivant .. pour une raison quelconque les guillemets simples doivent être guillemets doubles pour analyser correctement les variables ..

<?php 

$min_quality = 60; $max_quality = 85; 

$keep_original = 'dont_keep'; 

if ($keep_original == 'keep') { 

    $image_name = 'image.png'; 

    $path_to_image = 'images/' . $image_name; 

    $new_file = 'image2.png'; 

    $path_to_new_image = 'images/' . $new_file; 

    // don't know how to output to specified $new_file name 
    system("pngquant --quality=$min_quality-$max_quality $path_to_image"); 

} else { 

    $image_name = 'image.png'; 

    $path_to_image = 'images/' . $image_name; 

    // don't know if you can overwrite file by same name as additional parameter 
    system("pngquant --quality=$min_quality-$max_quality $path_to_image"); 

    // dont't know how you get the name of the new optimised image 
    $optimised_image = 'images/' . $whatever_the_optimised_image_is_called; 

    rename($optimised_image, $image_name); 

    unlink($optimised_image); 
} 

?> 

Répondre

1

de les docs de this program:

le nom du fichier de sortie est le même que le nom d'entrée, sauf que \ n \ it se termine dans \ "- fs8.png \", \ "- or8.png \" ou votre commande extension

donc, pour cette question:

// don't know how to output to specified $new_file name 
system("pngquant --quality=$min_quality-$max_quality $path_to_image"); 

de choisir un nouveau nom, supposons que vous êtes Compresser image name.png:

--ext=_x.png 

cela va créer une nouvelle image appelée name_x.png

ainsi, votre $new_file serait juste un suffixe,

$new_file = '_x.png'; // to choose new file name name_x.png 

// ne sais pas si vous pouvez remplacer le fichier par même nom que le paramètre supplémentaire

comme mentionné dans le programme docs, le nouveau nom de fichier sera suffixé par -fs8.png ou -or8.png, de sorte que vous pouvez renommer le fichier qui sera produit avec ce suffixe, OU simplement définir le --ext option: .png et cela ajoutera au fichier d'origine

--ext=.png 

pour plus de détails, consultez the repository

+0

merci mon pote :) –

+0

excuses d'avoir choisi ma réponse, je vais certainement lire le dépôt prochaine fois –

+0

il est Okey, mais la solution de votre écrit -comme je pense et compris du programme DOCS- va écraser alway sur l'image originale – hassan

1

j'ai parlé à Pornel Whos le chappie qui a développé pngquant. c'est en fait beaucoup plus simple que tout ce que j'ai écrit cela avant ...

! important - il est très important d'utiliser escapeshellarg() sinon les gens peuvent prendre le contrôle de votre serveur en téléchargeant un fichier avec un nom de fichier spécial apparemment.

$image_name = 'image.png'; 

$target_file = 'images/' . $image_name; 

$existing_image = 'image.png'; // image already on server if applicable 

$keep = 'keep'; 

$target_escaped = escapeshellarg($target_file); 

if ($keep == 'keep') { 

    // process/change output file to image_compressed.png keeping both images 
    system("pngquant --force --quality=70 $target_escaped --ext=_compressed.png"); 

    $remove_ext = substr($newFileName, 0 , (strrpos($newFileName, "."))); 

// $new_image is just the name (image_compressed.png) if you need it  
$new_image = $remove_ext . '_compressed.png'; 

    // remove old file if different name 
    if ($existing_image != $newFileName) { 

    $removeOld = '../images/' . $existing_image; 

    unlink($removeOld); 

    } // comment out if you want to keep existing file 

} else { 

    // overwrite if file has the same name 
    system("pngquant --force --quality=70 $target_escaped --ext=.png"); 

    // remove old file if different name 
    if ($existing_image != $newFileName) { 

    $removeOld = '../images/' . $existing_image; 

    unlink($removeOld); 

    } 

    $new_image = $newFileName; 
}