Почему размер изображения PNG намного больше, чем исходное изображение?

Я совершенно смущен, почему изображения PNG, размер которых изменяется с использованием библиотеки GD, намного больше по размеру, чем оригинал.

Это код, который я использую для изменения размера изображения:

// create image from posted file $src = imagecreatefrompng($file['tmp_name']); // get original size of uploaded image list($width,$height) = getimagesize($file['tmp_name']); if($width>$maxImgWidth) { // resize the image to maxImgWidth, maintain the original aspect ratio $newwidth = $maxImgWidth; $newheight=($height/$width)*$newwidth; $newImage=imagecreatetruecolor($newwidth,$newheight); // fill transparent with white /*$white=imagecolorallocate($newImage, 255, 255, 255); imagefill($newImage, 0, 0, $white);*/ // the following is to keep PNG's alpha channels // turn off transparency blending temporarily imagealphablending($newImage, false); // Fill the image with transparent color $color = imagecolorallocatealpha($newImage,255,255,255,127); imagefill($newImage, 0, 0, $color); // restore transparency blending imagesavealpha($newImage, true); // do the image resizing by copying from the original into $newImage image imagecopyresampled($newImage,$src,0,0,0,0,$newwidth,$newheight,$width,$height); // write image to buffer and save in variable ob_start(); // Stdout --> buffer imagepng($newImage,NULL,5); // last parameter is compression 0-none 9-best (slow), see also http://www.php.net/manual/en/function.imagepng.php $newImageToSave = ob_get_contents(); // store stdout in $newImageToSave ob_end_clean(); // clear buffer // remove images from php buffer imagedestroy($src); imagedestroy($newImage); $resizedFlag = true; } 

Затем я сохраняю $ newImageToSave как blob в базе данных mysql.

Я попытался предотвратить альфа-канал и просто установить белый фон, никаких существенных изменений в размере файла. Я попытался установить параметры сжатия (от 0 до 9), но все же больше, чем оригинал.

пример
Я взял это изображение (1058px * 1296px) и изменил его размер до 900px * 1102px. Вот результаты:

Исходный файл: 328 КБ
PNG (0): 3,79 МБ
PNG (5): 564 КБ
PNG (9): 503 КБ

Приветствуется любой совет, как получить уменьшенное изображение размером в размер файла.

PS: Я думал, что это может быть бит глубина, но, как вы можете видеть, пример изображения выше имеет 32 бита, тогда как размер изображения размером 24 бит.

Related of "Почему размер изображения PNG намного больше, чем исходное изображение?"

Вы не выполняете большинство функций, которые вы вызываете, чтобы уменьшить изображение, imagefill , imagealphablending т. Д., Может привести к увеличению размера файла.

Чтобы поддерживать прозрачное использование imagecreate вместо imagecreatetruecolor и просто сделать простое изменение размера

 $file['tmp_name'] = "wiki.png"; $maxImgWidth = 900; // create image from posted file $src = imagecreatefrompng($file['tmp_name']); // get original size of uploaded image list($width, $height) = getimagesize($file['tmp_name']); if ($width > $maxImgWidth) { $newwidth = $maxImgWidth; $newheight = ($height / $width) * $newwidth; $newImage = imagecreate($newwidth, $newheight); imagecopyresampled($newImage, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagepng($newImage, "wiki2.png", 5); imagedestroy($src); imagedestroy($newImage); $resizedFlag = true; } 

Конечный размер: 164 КБ