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