WebP – це сучасний формат стиснутих зображень, який запровадила компанія Google ще в далекому 2010 році. Але тільки зараз цей формат стає стандартом для використання майже на всіх сайтах. Адже ущільнені картинки цього формату збільшують продуктивність і швидкість завантаження сторінок сайту в декілька разів.
В цьому матеріалі, я покажу вам, як за допомогою PHP можна реалізувати конвертацію картинок з формату JPG, або PNG в формат WebP.
Конвертація JPG або PNG в WebP
<?php
// Вказуємо шлях до вхідного файлу (наприклад, JPEG або PNG)
$inputFilePath = 'шлях_до_вашої_картинки.jpg';
// Вказуємо шлях до вихідного файлу WebP
$outputFilePath = 'шлях_до_вашої_картинки.webp';
// Отримуємо ресурс зображення
$image = imagecreatefromjpeg($inputFilePath); // для JPEG
// або
// $image = imagecreatefrompng($inputFilePath); // для PNG
// Зберігаємо зображення у форматі WebP
imagewebp($image, $outputFilePath);
// Звільняємо ресурси
imagedestroy($image);
?>
Мінус цього коду в тому, що тут ви можете вказати і конвертувати зображення тільки одного якогось формату: JPG, або PNG.
Тому краще зробити так, щоб можна було виконувати конвертацію файлів зображень любого формату.
Конвертація зображень в формат WebP на PHP
<?php
// Шлях до вхідного файлу
$inputFileName = '1.bmp';
// Шлях до вихідного файлу WebP
$outputFileName = '2.webp';
// Отримання типу зображення
$inputFilePath = 'шлях_до_вашої_папки' . DIRECTORY_SEPARATOR . $inputFileName;
// Зчитування вмісту файлу в рядок
$imageData = file_get_contents($inputFilePath);
// Отримання типу зображення на основі даних з рядка
$imageType = exif_imagetype($inputFilePath);
// Перевірка чи є файл картинкою
if (!$imageType) {
die('Файл не є підтримуваним зображенням.');
}
// Отримати ресурс зображення
$image = imagecreatefromstring($imageData);
// Зберегти зображення у форматі WebP
imagewebp($image, $outputFileName);
// Звільнити ресурси
imagedestroy($image);
?>
Цей код дозволяє конвертувати файли будь-якого підтримуваного формату в формат WebP. Він зчитує вміст файлу в рядок, отримує тип зображення і використовує imagecreatefromstring для створення ресурсу зображення без прив'язки до конкретного формату файлу.
Зверніть увагу на те, що в даному коді, ви обов'язково повинні вказати шлях до папки з вхідним та вихідним файлом.
Пакетна обробка картинок
Якщо у вас дуже багато картинок, то цілком логічно, що краще написати програму, яка буде обробляти всі картинки які є у зазначеній вами папці. Ось приклад коду, який допоможе реалізувати подібну обробку картинок.
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['images']['tmp_name'][0])) {
// Отримання списку вибраних файлів
$inputFilePaths = $_FILES['images']['tmp_name'];
// Шлях до вихідної папки WebP
$outputFolder = 'output_folder/';
// Перевірка існування вихідної папки
if (!file_exists($outputFolder)) {
mkdir($outputFolder, 0777, true);
}
foreach ($inputFilePaths as $index => $inputFilePath) {
// Перевірка наявності вхідного файлу
if (!file_exists($inputFilePath)) {
echo 'Помилка: Файл ' . $_FILES['images']['name'][$index] . ' не знайдено.<br>';
continue;
}
// Отримання розширення файлу
$extension = pathinfo($_FILES['images']['name'][$index], PATHINFO_EXTENSION);
// Перевірка чи є файл картинкою за допомогою exif_imagetype
$imageType = exif_imagetype($inputFilePath);
if (!$imageType || !in_array($imageType, [IMAGETYPE_JPEG, IMAGETYPE_PNG], true)) {
echo 'Файл ' . $_FILES['images']['name'][$index] . ' не є підтримуваним зображенням і тому його не було опрацьовано.<br>';
continue;
}
// Отримання ресурсу зображення
switch ($imageType) {
case IMAGETYPE_JPEG:
$image = imagecreatefromjpeg($inputFilePath);
break;
case IMAGETYPE_PNG:
$image = imagecreatefrompng($inputFilePath);
break;
// Можливо, вам потрібно додати інші формати зображень, якщо вони використовуються
default:
echo 'Непідтримуваний формат зображення для файлу ' . $_FILES['images']['name'][$index] . '.<br>';
continue 2; // Пропустити до наступної ітерації зовнішнього циклу
}
// Перевірка успішності створення ресурсу зображення
if (!$image) {
echo 'Помилка: Неможливо створити ресурс зображення для файлу ' . $_FILES['images']['name'][$index] . '.<br>';
continue;
}
// Збереження зображення у форматі WebP
$outputFilePath = $outputFolder . pathinfo($_FILES['images']['name'][$index], PATHINFO_FILENAME) . '.webp';
if (!imagewebp($image, $outputFilePath)) {
echo 'Помилка: Неможливо зберегти зображення у форматі WebP для файлу ' . $_FILES['images']['name'][$index] . '.<br>';
continue;
}
// Звільнення ресурсів
imagedestroy($image);
echo 'Файл ' . $_FILES['images']['name'][$index] . ' успішно конвертовано в ' . $outputFilePath . '.<br>';
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Завантажити та конвертувати</title>
</head>
<body>
<!-- Форма для завантаження файла або папки -->
<form method="post" enctype="multipart/form-data">
<input type="file" name="images[]" accept="image/*" multiple="multiple" webkitdirectory directory>
<button type="submit">Завантажити та конвертувати</button>
</form>
</body>
</html>
Примітка.
Цей код працює тільки з картинками JPG та PNG.
Мультивибір картинок для конвертації
Багаторазовий вибір картинок дозволяє опрацювати не всі картинки в заданому каталозі, а тільки декілька картинок які вказує користувач.
<?php
// Перевірка, чи були відправлені файли
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['images']) && is_array($_FILES['images']['tmp_name'])) {
// Шлях до вихідної папки WebP
$outputFolder = 'output_folder/';
// Перевірка існування вихідної папки
if (!file_exists($outputFolder)) {
mkdir($outputFolder, 0777, true);
}
foreach ($_FILES['images']['tmp_name'] as $index => $inputFilePath) {
// Перевірка наявності вхідного файлу
if (!file_exists($inputFilePath)) {
echo 'Помилка: Файл ' . $_FILES['images']['name'][$index] . ' не знайдено.<br>';
continue;
}
// Отримання ресурсу зображення
$image = imagecreatefromstring(file_get_contents($inputFilePath));
// Перевірка успішності створення ресурсу зображення
if (!$image) {
echo 'Помилка: Неможливо створити ресурс зображення для файлу ' . $_FILES['images']['name'][$index] . '.<br>';
continue;
}
// Збереження зображення у форматі WebP
$outputFilePath = $outputFolder . pathinfo($_FILES['images']['name'][$index], PATHINFO_FILENAME) . '.webp';
if (!imagewebp($image, $outputFilePath)) {
echo 'Помилка: Неможливо зберегти зображення у форматі WebP для файлу ' . $_FILES['images']['name'][$index] . '.<br>';
continue;
}
// Звільнення ресурсів
imagedestroy($image);
echo 'Файл ' . $_FILES['images']['name'][$index] . ' успішно конвертовано в ' . $outputFilePath . '.<br>';
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Завантажити та конвертувати</title>
</head>
<body>
<!-- Форма для завантаження файлів -->
<form method="post" enctype="multipart/form-data">
<input type="file" name="images[]" accept="image/*" multiple="multiple">
<button type="submit">Завантажити та конвертувати</button>
</form>
</body>
</html>
Увага!
Для виконання завдань, пов'язаних із конвертацією зображень в формат WebP, потрібно, щоб ваш сервер мав бібліотеку GD (Graphics Draw) із підтримкою WebP.
