CakeFest 2017 NYC, the Official CakePHP Conference


(PHP 5 >= 5.5.0, PHP 7)

imagewebpWebP 画像をブラウザあるいはファイルに出力する


bool imagewebp ( resource $image , mixed $to [, int $quality = 80 ] )

指定した image を、WebP 形式で出力あるいは保存します。



imagecreatetruecolor() のような画像作成関数が返す画像リソース。


ファイル保存先のパスあるいはオープン中のリソース (この関数が値を戻した後で自動的にクローズされます)。省略したり NULL を設定したりした場合は、画像ストリームを直接出力します。


quality には、0 (品質は最低で、 ファイルサイズが小さくなる) から 100 (品質が最高で、ファイルサイズは大きくなる) までの値を指定します。


成功した場合に TRUE を、失敗した場合に FALSE を返します。


バージョン 説明
5.4.0 ストリームリソースを to に渡せるようになりました。

例1 WebP ファイルの保存

// 空の画像を作成し、テキストを追加します
$im imagecreatetruecolor(12020);
$text_color imagecolorallocate($im2331491);

imagestring($im155,  'WebP with PHP'$text_color);

// 画像を保存します

// メモリを解放します

add a note add a note

User Contributed Notes 2 notes

orangefish at sogetthis dot com
3 years ago
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):


* 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
* @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?");


So for example when user is uploading a PNG file:


= $_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!)
mauro dot ludovico dot colella at gmail dot com
2 years ago
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.
To Top