Почему изображение с водяным знаком так сильно увеличивается в размере в WordPress?

Я использую код в файле function.php в WordPress для изображения с водяным знаком. Моя проблема в том, что изображение с водяным знаком стало слишком большим. Если размер исходного изображения составляет 1 МБ, размер изображения с водяным знаком составляет 13 МБ. Что происходит? Почему изображение с водяным знаком так сильно увеличивается в размере? Это код, который я использую:

function add_watermark_to_image( $attachment_id ) {
    $image_sizes = get_intermediate_image_sizes();
    $watermark_attachment_id = YOUR_ATTACHMENT_ID; // Replace with your watermark attachment ID

   foreach ( $image_sizes as $size ) {
        $image_path     = get_attached_file( $attachment_id );
        $watermark_path = get_attached_file( $watermark_attachment_id );

        if ( $image_path && file_exists( $image_path ) && $watermark_path && file_exists( $watermark_path ) ) {
            $image     = imagecreatefromstring( file_get_contents( $image_path ) );
            $watermark = imagecreatefrompng( $watermark_path );

            if ( $image && $watermark ) {
                list( $image_width, $image_height )         = getimagesize( $image_path );
                list( $watermark_width, $watermark_height ) = getimagesize( $watermark_path );

                // Set the position of the watermark (bottom right)
                $dest_x = $image_width - $watermark_width;
                $dest_y = $image_height - $watermark_height;
                imagecopy( $image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height );

                // Save the watermarked image
                imagepng( $image, $image_path );
                imagedestroy( $image );
                imagedestroy( $watermark );
            } else {
                error_log( 'Image or watermark creation failed for size: ' . $size );
            }
        } else {
            error_log( 'Image or watermark not found for size: ' . $size );
        }
    }
}
add_action( 'add_attachment', 'add_watermark_to_image' );

Вы используете значения качества по умолчанию, возможно, степень сжатия у них ниже, чем у исходного изображения.

Honk der Hase 17.07.2024 13:53

Я бы добавил, что «качество» — не идеальное слово для описания степени сжатия файла PNG, поскольку файлы PNG не имеют потерь. Таким образом, если задать более высокое значение «качества» для imagepng(), размер файла уменьшится, время сжатия увеличится, а качество останется таким же.

TinouHD 17.07.2024 13:58

Было ли исходное изображение размером 1 МБ уже в формате PNG? Или, возможно, это был JPG?

CBroe 17.07.2024 15:19

Исходный файл — JPG, водяной знак — PNG. Но размер PNG составляет несколько КБ.

Pityer 17.07.2024 17:11

Вся суть сжатия JPEG с потерями заключается в уменьшении размера изображения до ~ 10% от исходного изображения. Если вы конвертируете JPEG в PNG, вы можете ожидать обратного.

Álvaro González 18.07.2024 11:54

Я не конвертирую из jpg в png. Я помещаю водяной знак PNG на изображение jpg, что превращает его в jpg.

Pityer 18.07.2024 12:47

Вы сохраняете его как PNG, поэтому можете поставить водяной знак PNG на изображение JPG и сохранить PNG! Поэтому ожидается увеличение размера.

TinouHD 18.07.2024 13:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как мы уже говорили в комментариях, вы сохраняете окончательный результат в виде файла PNG, который представляет собой сжатый формат без потерь для хранения изображений. Это может привести к тому, что ваш файл результатов будет иметь (намного) больший размер!

Вы можете использовать функцию imagejpeg(), чтобы сохранить результат в формате jpg. Вы можете добавить параметр качества, который будет изменять степень сжатия. Это может значительно уменьшить размер файла, но повлияет на качество изображения.

// [...]
$image = imagecreatefromstring(file_get_contents($image_path));
$watermark = imagecreatefrompng($watermark_path);
if ($image && $watermark) {
    list($image_width, $image_height) = getimagesize($image_path);
    list($watermark_width, $watermark_height) = getimagesize($watermark_path);

    // Set the position of the watermark (bottom right)
    $dest_x = $image_width - $watermark_width;
    $dest_y = $image_height - $watermark_height;
    imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);

    // Save the watermarked image
    imagejpeg($image, $image_path, 80); // 80 is the quality (0-100) greater quality will increase the file size.
    imagedestroy($image);
    imagedestroy($watermark);
} else {
    error_log('Image or watermark creation failed for size: ' . $size);
}
// [...]

Другие вопросы по теме