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); } }