2010-12-13 3 views
5

я использовал утилиту поджигатель страницы скорости и одно из предложений, приведенных в том, чтобы сжать изображения - Так что я написал следующий код для сжатия изображенияPHP сжатия изображения, показывающее различные результаты

 
$filename="http://localhost.com/snapshots/picture.png"; 
$img = imagecreatefrompng($filename); 
$this->_response->setHeader('Content-Type', 'image/png'); 
imagepng($img,null,9); 
imagedestroy($img); 

Теперь реального изображения размер 154K Так что я экспериментировал, давая различные уровни качества, и вот что я нашел

 
imagepng($img,null,0); --> Size = 225K 
imagepng($img,null,1); --> Size = 85.9K 
imagepng($img,null,2); --> Size = 83.7K 
imagepng($img,null,3); --> Size = 80.9K 
imagepng($img,null,4); --> Size = 74.6K 
imagepng($img,null,5); --> Size = 73.8K 
imagepng($img,null,6); --> Size = 73K 
imagepng($img,null,7); --> Size = 72.4K 
imagepng($img,null,8); --> Size = 71K 
imagepng($img,null,9); --> Size = 70.6K 

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

Во-вторых, это лучший способ работы в PHP для сжатия изображений перед их рендерингом в браузере для повышения производительности.

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

 
$video = $this->_getParam('video'); 
$imgContent = base64_decode($this->_getParam('snapshot')); 
file_put_contents("snapshots/" . $video . ".png", $imgContent); 

EDITED на основе предложений Альвары, я сделал следующее изменение в код, который генерирует много маленького JPG файла

 
$video = $this->_getParam('video'); 
$imgContent = base64_decode($this->_getParam('snapshot')); 
file_put_contents("snapshots/" . $video . ".png", $imgContent); 

$filename="snapshots/".$video.".png"; 
$img = imagecreatefrompng($filename); 
imagejpeg($img,'test.jpg',75); 

Так что теперь это процесс

3 шага
  1. создать исходное изображение с помощью file_put_contents
  2. Используйте imagecreatefrompng и imagejpeg сжать файл и создать меньшее изображение
  3. Удалить Orig изображение

Это лучший оптимальный способ пойти об этом ,

+0

Какова глубина бит оригинального изображения? – stillstanding

+0

Я не совсем уверен, что такое глубина бит - Спасибо – Gublooo

+0

Вам нужно решение PHP? – Gumbo

ответ

4

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

И последнее, но не менее важное: вы должны сжимать изображения один раз (обычно, когда они загружаются), причем не каждый раз, когда они обслуживаются. Я полагаю, что ваш код - это просто быстрый тест, но на всякий случай я упоминаю.

Ответ на обновленный вопрос:

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

+0

+1 для последнего абзаца. – Shikiryu

+0

. Спасибо Alvaro за хорошие указатели. Мне не приходило в голову сохранить их изначально в jpg или gif формат - прямо сейчас есть флеш-видеомагнитофон, который записывает видео и создает изображение моментального снимка в каталог, из которого я читаю, чтобы отображать его в браузере - мне, возможно, придется сделать правильное исправление и посмотреть, как изображение сохраняется изначально вместо того, чтобы сжимать его каждый раз, поскольку @Chochenos также предложил тот же подход - Спасибо – Gublooo

+0

Пожалуйста, посмотрите на мой отредактированный вопрос, где я разместил код, который сохраняет файл png – Gublooo

3

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

+0

спасибо mck - да, я знал, что последним параметром был уровень сжатия, но в руководстве php они ссылаются на него как на качество, поэтому я использовал этот термин. Спасибо, что подтвердили, что я на правильном пути. – Gublooo

0

1- Результат кажется точным, так как 0 означает без сжатия

качество уровня

сжатия: от 0 (нет сжатия) до 9.

Это нормально для файл 0 должен быть больше оригинала (который можно слегка сжать для начала). Вам нужно понять сжатие файлов и конструктор изображений PHP GD.

2- ИМХО, самым мудрым выбором было бы сжать ваш файл png перед загрузкой их на ваш сервер (конечно, он заявляет только, если у вас есть выбор: статический, несколько файлов).

Помощь для этого:

Если это означает быть динамическими, PHP является выбор.

+0

Спасибо Chouchenos - я где-то читал, что независимо от того, какой уровень сжатия u задает размер, не может быть больше, чем исходное изображение, но я думаю, мне нужно понять весь материал сжатия файла, прежде чем комментировать его. – Gublooo

+0

Спасибо за ссылки - прямо сейчас у меня нет возможности сжимать их перед загрузкой, поэтому мне нужно пойти с этой опцией, но спасибо за ресурсы. Ценить это. – Gublooo

+0

Пожалуйста, посмотрите мой отредактированный вопрос, где я разместил код, который сохраняет файл png. – Gublooo

Смежные вопросы