It is also possible to defer the creation of png replacements for WebP images to the client, with notably the library libwebpjs enabling transparent conversion.
(PHP 5 >= 5.4.0, PHP 7)
imagewebp — Affiche une image WebP vers un navigateur ou un fichier
Affiche ou sauvegarde une version WebP de l'image
fournie.
image
Une ressource d'image, retournée par une des fonctions de création d'images, comme imagecreatetruecolor().
to
Le chemin ou un flux de ressource ouvert (qui sera automatiquement fermé après
le retour de cette fonction) vers lequel le fichier sera sauvegardé. Si défini à NULL
, le flux
brute de l'image sera affiché directement.
quality
quality
plage de 0 (la pire qualité, plus petit
fichier) à 100 (meilleure qualité, plus grand fichier).
Cette fonction retourne TRUE
en cas de
succès ou FALSE
si une erreur survient.
Version | Description |
---|---|
5.4.0 |
Ajout de la prise en charge des flux resource pour le
paramètre to .
|
Exemple #1 Sauvegarde d'un fichier WebP
<?php
// Crée une image vide et on y ajoute du texte
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'WebP avec PHP', $text_color);
// Sauvegarde de l'image
imagewebp($im, 'php.webp');
// Libération de la mémoire
imagedestroy($im);
?>
It is also possible to defer the creation of png replacements for WebP images to the client, with notably the library libwebpjs enabling transparent conversion.
WebP is a great file format, but it's basically supported only by Chrome. For WebP files with transparency it's necessary to have PNG fallback for other browsers (otherwise it won't work in iOS, Firefox, IE, etc.).
Regular truecolor PNG with alpha gives pretty large files, but there's a special smaller PNG file variant that can be created by pngquant - a command line utility.
If you have pngquant 1.8 on your server (just get package from official pngquant website), then you can create small fallback images (with quality better than from PHP's libgd):
<?php
/**
* Optimizes PNG file with pngquant 1.8 or later (reduces file size of 24-bit/32-bit PNG images).
*
* You need to install pngquant 1.8.x on the server (ancient version 1.0 won't work).
* There's package for Debian/Ubuntu and RPM for other distributions on http://pngquant.org
*
* @param $path_to_png_file string - path to any PNG file, e.g. $_FILE['file']['tmp_name']
* @param $max_quality int - conversion quality, useful values from 60 to 100 (smaller number = smaller file)
* @return string - content of PNG file after conversion
*/
function compress_png($path_to_png_file, $max_quality = 90)
{
if (!file_exists($path_to_png_file)) {
throw new Exception("File does not exist: $path_to_png_file");
}
// guarantee that quality won't be worse than that.
$min_quality = 60;
// '-' makes it use stdout, required to save to $compressed_png_content variable
// '<' makes it read from the given file path
// escapeshellarg() makes this safe to use with any path
$compressed_png_content = shell_exec("pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg( $path_to_png_file));
if (!$compressed_png_content) {
throw new Exception("Conversion to compressed PNG failed. Is pngquant 1.8+ installed on the server?");
}
return $compressed_png_content;
}
?>
So for example when user is uploading a PNG file:
<?php
$read_from_path = $_FILE['file']['tmp_name'];
$save_to_path = "uploads/compressed_file.png";
$compressed_png_content = compress_png($read_from_path);
file_put_contents($save_to_path, $compressed_png_content);
// you don't need move_uploaded_file().
// and for webp:
imagewebp(imagecreatefrompng($read_from_path), $save_to_path + ".webp");
?>
And then you can use URL with .webp version in Chrome and browsers that send Accept: image/webp, and .png for the rest (and all will get small file!)