php webp

Конвертация изображений в формат WebP с помощью PHP и библиотеки GD

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>

Мультивыбор картинок для конвертации

Многократный выбор картинок позволяет проработать не все картинки в заданном каталоге, а только несколько картинок, которые указывает пользователь.

<?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

Main Menu