Warning: imagepng() [function.imagepng]: gd-png: fatal libpng error: zlib error

Недавно пытался сгенерировать через PHP картинку в формате PNG и столкнулся с ошибкой:

<?php imagepng($image, 'filename.jpg, 100); ?>
Warning: imagepng() [function.imagepng]: gd-png: fatal libpng error: zlib error and Warning: imagepng() [function.imagepng]: gd-png error: setjmp returns error condition.

Warning: imagepng() [function.imagepng]: gd-png error: setjmp returns error condition in resizer.php on line 162

Гугль сообщил мне, что не я один с такой ситуацией столкнулся. Решение простое и незамысловатое 🙂

Оказывается, третий параметр функции ImagePNG имеет другие допустимые решения. По аналогии с функцией imagejpeg я считал, что этот параметр означает качество (0 — самое плохое, 100 самое хорошее). Но этот параметр означает степень компресии (9 = максимальная компрессия, 0 = наименьшая компрессия). Она является обратной по сравнению с шкалой для JPG.

Если у вас есть метод, который может генерировать картинки нескольких форматов, можно сделать простое преобразование значения параметра качества:

<?php
/**
 * Вывести объект-изображение в заданном формате с заданным качеством в файл
 * @param int $quality   Качество генерируемого изображения ( 0 = минимальное качество, 100 = максимальное качество)
 */
function resize($image, $type, $quality, $filename) {
    ...
    switch($type) {
        case 'gif':
            imagegif($image, $filename); // параметр качества не предусмотрен
            break;
        case 'jpg':
            imagejpeg($image, $filename, $quality); // диапазон значений параметра $quality = 0...100, 100 = максимальное качество картинки
            break;
        case 'png':
            $quality = max(0,9-(int)($quality/11.1)); // диапазон значений 0...9, 0 = максимальное качество
            imagepng($image, $filename, $quality);
    }
}

Павел Волынцев

Уже более 15 лет занимаюсь разработкой веб-проектов. Fullstack Senior Developer. IT евангелист — доношу свет знаний об информационных технологиях. Профессиональные цели: Дать людям возможность дать людям больше.

Читайте также: