Я использую простой скрипт, который я написал, и он довольно стандартный:
$imgbuffer = imagecreatetruecolor($thumbwidth, $thumbheight); switch($type) { case 1: $image = imagecreatefromgif($img); break; case 2: $image = imagecreatefromjpeg($img); break; case 3: $image = imagecreatefrompng($img); break; case 6: $image = imagecreatefrombmp($img); break; case 15: $image = imagecreatefromwbmp($img); break; default: return log_error("Tried to create thumbnail from $img: not a valid image"); } imagecopyresampled($imgbuffer, $image, 0, 0, 0, 0, $thumbwidth, $thumbheight, $width, $height); $output = imagepng($imgbuffer, "$album/thumbs/$imgname.png", 9);
9 – это настройка самого низкого качества, но из изображения JPEG 400 x 600 (при 56 КБ) я получаю миниатюру размером 27 кБ (140 х 140). Использование imagejpeg (качество 80) вместо imagepng составляет около 4 КБ.
Как это может быть, особенно при настройке самого низкого качества для изображения? Я попытался использовать imagecopy вместо imagecopyresampled, и imagecreate вместо истинной цветовой версии. К сожалению, изображения выглядят как-то искалеченными.
Есть ли способ получить миниатюры PNG с достаточно маленьким размером файла (около 4 кБ при 140 х 140)? Или мне нужно использовать JPEG?
PNG представляет собой формат без потерь и не даст хороших коэффициентов сжатия для фотографий и других сложных изображений, которые обычно сжимаются в файлах JPEG.
Чтобы ухудшить ситуацию, если вы конвертируете файлы JPEG в PNG, PNG также придется воспроизводить пиксельные пиксельные артефакты сжатия, вызванные сжатием JPEG с потерями.
Используйте PNG только для компьютерной графики и других изображений, которые сильно сжимаются или когда вы абсолютно не можете потерять какие-либо данные (или, как правильно указал Крис, когда вам нужен альфа-канал).