PHP: imagepng создает чрезмерно большие файлы - PullRequest
1 голос
/ 16 июня 2010

Я использую простой эскиз, который я написал, и он довольно стандартен:

$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 КБ.

Как это может быть, особенно при низком качестве изображения для imagepng?Я попытался использовать imagecopy вместо imagecopyresampled и imagecreate вместо истинной цветной версии.К сожалению, изображения получаются искаженными.

Есть ли способ получить миниатюры PNG с относительно небольшим размером файла (около 4 КБ при 140 x 140)?Или я должен использовать JPEG?

1 Ответ

8 голосов
/ 16 июня 2010

PNG - это формат без потерь, который не даст хороших коэффициентов сжатия для фотографий и других сложных изображений, которые обычно сжимаются в файлах JPEG.

Что еще хуже, если вы конвертируете файлы JPEG в PNG,PNG также должен воспроизводить попиксельные артефакты сжатия, вызванные сжатием с потерями JPEG.

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

...