Php convert png to webp

imagewebp

Выведет или сохранит WebP-версию данного изображения ( image ).

Список параметров

Объект GdImage , возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor() .

Путь, или открытый потоковый ресурс (который автоматически закрывается после завершения функции), для сохранения файла. Если не установлен или равен null , изображение будет выведено в поток вывода в бинарном виде.

quality варьируется от 0 (худшее качество, меньший размер файла) до 100 (наилучшее качество, большой файл).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Однако, если libgd не может вывести изображения, эта функция вернёт true .

Список изменений

Версия Описание
8.0.0 image теперь ожидает экземпляр GdImage ; ранее ожидался корректный gd ресурс ( resource ).

Примеры

Пример #1 Сохранение WebP-файла

// Создать пустое изображение и добавить текст
$im = imagecreatetruecolor ( 120 , 20 );
$text_color = imagecolorallocate ( $im , 233 , 14 , 91 );

imagestring ( $im , 1 , 5 , 5 , ‘WebP with PHP’ , $text_color );

// Сохранить изображение
imagewebp ( $im , ‘php.webp’ );

// Освободить память
imagedestroy ( $im );
?>

User Contributed Notes 7 notes

As of today (end of january 2019), WebP is now supported across all the major browsers (Edge, Chrome, Firefox, Opera).

To convert a PNG image to Webp, we can do this:

// Image
$dir = ‘img/countries/’ ;
$name = ‘brazil.png’ ;
$newName = ‘brazil.webp’ ;

// Create and save
$img = imagecreatefrompng ( $dir . $name );
imagepalettetotruecolor ( $img );
imagealphablending ( $img , true );
imagesavealpha ( $img , true );
imagewebp ( $img , $dir . $newName , 100 );
imagedestroy ( $img );

Function to save any image to Webp

public static function webpImage($source, $quality = 100, $removeOld = false)
$dir = pathinfo($source, PATHINFO_DIRNAME);
$name = pathinfo($source, PATHINFO_FILENAME);
$destination = $dir . DIRECTORY_SEPARATOR . $name . ‘.webp’;
$info = getimagesize($source);
$isAlpha = false;
if ($info[‘mime’] == ‘image/jpeg’)
$image = imagecreatefromjpeg($source);
elseif ($isAlpha = $info[‘mime’] == ‘image/gif’) $image = imagecreatefromgif($source);
> elseif ($isAlpha = $info[‘mime’] == ‘image/png’) $image = imagecreatefrompng($source);
> else return $source;
>
if ($isAlpha) imagepalettetotruecolor($image);
imagealphablending($image, true);
imagesavealpha($image, true);
>
imagewebp($image, $destination, $quality);

if ($removeOld)
unlink($source);

WebP is not yet supported by Safari, although they are experimenting with it.

Check out https://caniuse.com/#search=webp for the latest support information.

Safari on mac now has limited support (limited to Safari 14+ on Big Sur or later)

Safari on iOS 14.4 and higher has full support

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 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
// ‘ // 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:

$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!)

Источник

Изображения WebP в GD PHP

WebP – формат сжатия изображений, разработанный Google. Имеет более меньший размер файла по сравнению с JPG, но не поддерживается продуктами Apple. В PHP поддержка формата появилась с версии 5.4.0.

Конвертирование в WebP

JPG в WebP

$src = __DIR__ . '/image.jpg'; $info = pathinfo($src); $img = imageCreateFromJpeg($src); imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100); imagedestroy($img);

PNG в WebP

$src = __DIR__ . '/image.png'; $info = pathinfo($src); $img = imageCreateFromPng($src); imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100); imagedestroy($img);

GIF в WebP

$src = __DIR__ . '/image.gif'; $info = pathinfo($src); $img = imageCreateFromGif($src); imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100); imagedestroy($img);

Вывод в браузер

header('Content-Type: image/webp'); imageWebp($img, null, 100);

WebP в другие форматы

JPG

$src = __DIR__ . '/image.webp'; $info = pathinfo($src); $img = imageCreatefromWebp($src); imageJpeg($img, $info['dirname'] . '/' . $info['filename'] . '.jpg', 100); imagedestroy($img);

Вывод в браузер:

header('Content-Type: image/jpeg'); imageJpeg($img, null, 100);

PNG

$src = __DIR__ . '/image.webp'; $info = pathinfo($src); $img = imageCreatefromWebp($src); imagePng($img, $info['dirname'] . '/' . $info['filename'] . '.png'); imagedestroy($img);

Вывод в браузер:

header('Content-Type: image/x-png'); imagePng($img);

GIF

$src = __DIR__ . '/image.webp'; $info = pathinfo($src); $img = imageCreatefromWebp($src); imageGif($img, $info['dirname'] . '/' . $info['filename'] . '.gif'); imagedestroy($img);

Вывод в браузер:

header('Content-Type: image/gif'); imageGif($img);

Проблемы с WebP

1. Баг c цветами

В библиотеке GD, в функции imageCreatefromWebp() есть ошибка из-за которой изображение теряет синий канал. Сообщалось что ошибка исправлена с PHP >= 5.6.12, но баг может встречаться на сборках PHP 7.

Оригинальное изображение Webp

В функции imageCreatefromWebp есть ошибка из-за которой изображение теряет синий канал

function fixBlue($img) < $tmp = imagecreatetruecolor(imagesx($img),imagesy($img)); $color = imagecolorallocate($tmp, 255, 255, 255); imagefill($tmp, 0, 0, $color); for ($y = 0; $y < imagesy($img); $y++) < for ($x=0; $x < imagesx($img); $x++) < $rgb = imagecolorat($img, $x, $y); $r = ($rgb >> 24) & 0xFF; $g = ($rgb >> 16) & 0xFF; $b = ($rgb >> 8) & 0xFF; $pixelcolor = imagecolorallocate($tmp, $r, $g, $b); imagesetpixel($tmp, $x, $y, $pixelcolor); > > return $tmp; >

Использование:

$src = __DIR__ . '/image.webp'; $info = pathinfo($src); $img = imageCreatefromWebp($src); $img = fixBlue($img); imageJpeg($img, $info['dirname'] . '/' . $info['filename'] . '.jpg'); imagedestroy($img);

2. Битые файлы

Некоторые файлы сгенерированные через PHP GD могут не открываться – причина тут в отсутствии нулевого байта в конце файла, из-за этого браузер считает такие изображения битыми. Исправляется следующим фиксом:

$file = __DIR__ . '/фото.jpg'; $new = __DIR__ . '/фото.webp'; $img = imageCreateFromJpg($file); imageWebp($img, $new, 100); imagedestroy($img); if (filesize($new) % 2 == 1)

3. Теряется прозрачность при сохранении PNG в WEBP

До версии библиотеки GD 2.2.5 у WEBP нет поддержки альфа-канала, эта версия уже входит в PHP 7.3, но на некоторых хостингах она установлена и на более ранних версиях PHP.

Источник

Converting images into WebP files using PHP.

In this tutorial, we are going to show you how to convert JPEG and PNG files into WebP images using PHP.

As you’re probably already aware, WebP is a superior web format to both JPEG and PNG. This is because it can create smaller file sizes with the exact same image quality.

Converting JPEG into WebP using PHP.

To convert a JPEG image into a WebP image, you can use the following piece of code.

//The file path of your image. $imagePath = 'dog.jpg'; //Create an image object. $im = imagecreatefromjpeg($imagePath); //The path that we want to save our webp file to. $newImagePath = str_replace("jpg", "webp", $imagePath); //Quality of the new webp image. 1-100. //Reduce this to decrease the file size. $quality = 100; //Create the webp image. imagewebp($im, $newImagePath, $quality);

In the example above, we took the following steps.

  1. We specify the file path of the original JPEG image that we want to convert.
  2. After that, we create an image object of the old file by using the imagecreatefromjpeg function.
  3. We then define the path and filename that we want to use for our new WebP image. In this case, we are using the exact same path. However, we are replacing the “jpg” extension with “webp”. Note that you may need to change this line to suit your own needs.
  4. We set the quality to 100. If you need to compress the image further, then you can reduce this number.
  5. Finally, we created a new WebP version of the image by using the imagewebp function.

Converting PNG files into WebP.

To convert a PNG image into the WebP format, we can modify the example above.

In this case, we will need to change the name of the extension and how we create the image object.

Simply put, this means changing “jpg” to “png” and using the imagecreatefrompng function instead of imagecreatefromjpeg.

//The path to your PNG file. $imagePath = 'dog.png'; //Create an image object. $im = imagecreatefrompng($imagePath); //Replace "png" with "webp". $newImagePath = str_replace("png", "webp", $imagePath); //Quality. 1-100. $quality = 100; //Create the webp image. imagewebp($im, $newImagePath, $quality);

This will also work for other formats. For example, if you need to convert a GIF file, then you can use PHP’s imagecreatefromgif function.

Displaying WebP images on-the-fly.

If we want to convert our image and display it “on-the-fly” instead of creating a new file, then we will need to change the final part of the code.

//The quality of our new webp image. 1-100. $quality = 100; //Set the content-type header('Content-Type: image/webp'); //Display the image in the browser by setting the second parameter to NULL. imagewebp($im, null, $quality); //Clean up / Destroy the image object. imagedestroy($im);

If you use the PHP code above, then you will notice that the converted image is displayed directly in the browser. This is because we specified the Content-Type header and then set the second parameter of imagewebp to null.

Источник

Читайте также:  Diffutils android kotlin пример
Оцените статью