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.
