#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. Кажется, это решает мою проблему, спасибо.