PHP: почему функция imagepng() увеличивает размер при сохранении изображения?

#php #size #png

#php #размер #png

Вопрос:

Я пытаюсь сохранить изображение в формате PNG, скопировав другое существующее изображение и используя функцию imagepng, но размер сохраненного файла увеличился. Вот исходное изображение.

 $destWidth = 1920;
$destHeight = 1080;

$srcWidth = 1920;
$srcHeight = 1080;

// im.png : 399,1 ko
// width : 1920
// heigth : 1080
$image = imagecreatefrompng('im.png');

$imageDest = imagecreatetruecolor($destWidth, $destHeight);

imagecopyresampled($imageDest, $image, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);

// imnew.png : 857,5 ko
imagepng($imageDest, 'imnew.png');
  

Исходное изображение имеет 399,1 ko (с разрешением 1920×1080).
Но результирующее изображение имеет 857,5 ko (все еще 1920×1080).
Почему? И есть ли какое-либо решение, чтобы не увеличивать размер?

Комментарии:

1. Изображения Truecolor занимают больше места, чем индексированные PNG.

Ответ №1:

Существует много способов сохранить изображение в файле PNG. Используемый метод должен отличаться между вашим оригиналом и изображением, сохраненным PHP. См:

https://www.w3.org/TR/2003/REC-PNG-20031110

Если вы посмотрите в руководстве, где задокументирована функция imagepng(), вы увидите, что в PHP также есть некоторые опции. Например $quality , параметр. Это один из способов уменьшить размер файла.

С помощью imagetruecolortopalette() вы можете попытаться уменьшить глубину цвета изображения. Это также может уменьшить размер выходного файла.

Не все методы уменьшения размера изображений, поддерживаемые форматом файла PNG, поддерживаются PHP.

Комментарии:

1. Но я до сих пор не знаю, почему с помощью моего метода получается такой большой размер. Я уже пробовал с другими изображениями PNG, и размер вообще не изменился. В частности, с этим изображением есть проблема.

2. Мне нужно было бы иметь исходное изображение, чтобы рассказать об этом подробнее. Вы дали код, но без изображения я не могу сказать, какой аспект изображения изменился.

3. Ну, теперь в исходном сообщении есть ссылка на изображение.

4. Спасибо. Да, это 8-битное цветное изображение, которое вы превращаете в 24-битное цветное изображение с помощью своего кода. Итак, попробуйте использовать imagetruecolortopalette() или использовать imagecreate() вместо imagecreatetruecolor() .

5. Хорошо, я попробовал imagetruecolortopalette($imageDest, False, 255) , тогда размер теперь 366,5 ko. Я тоже пробовал imagecreate($destWidth, $destHeight) , и размер составляет 403,7 ko. Кажется, это решает мою проблему, спасибо.