Наличие изображения без метаданных при загрузке в PHP - PullRequest
3 голосов
/ 24 марта 2009

На одном известном мне сайте недавно была увеличена пропускная способность с 2,5 ТБ в месяц до 3,5 ТБ.

Причина в том, что они недавно превысили лимит 2,5. Они жалуются, что не знают, как снизить пропускную способность.

Одна вещь, которую я не видел, они учитывают, это тот факт, что JPEG и другие изображения, которые отображаются на сайте (и это сайт с большим количеством изображений), могут содержать метаданные. Где и где был сделан снимок.

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

На сайте, который использует более 2,5 ТБ в месяц, удаление нескольких тысяч изображений их метаданных поможет уменьшить использование полосы пропускания, по крайней мере, на несколько гигабайт в месяц, если не больше.

Так есть ли способ сделать это в PHP? А также, для уже существующих файлов, кто-нибудь знает хороший автоматический съемник метаданных? Я знаю JPEG & PNG Stripper , но это не очень хорошо ... Может быть полезно для начальной очистки, хотя ...

Ответы [ 7 ]

6 голосов
/ 24 марта 2009

Это тривиально с GD:

$img = imagecreatefromjpeg("myimg.jpg");
imagejpeg($img, "newimg.jpg", $quality);
imagedestroy($img);

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

5 голосов
/ 24 марта 2009

Я серьезно сомневаюсь, что метаданные изображения - корень всего зла здесь.

Некоторые вопросы для рассмотрения:

  • Как настроен веб-сервер?
  • Правильно ли выдает http 304 ответы?
  • Нет ли какого-либо ручного кэширования / потоковой передачи данных через php-скрипты, которое не позволяет указанным данным кэшироваться браузером? (в этом случае следует рассмотреть переписывание URL-адресов и перенаправление http).
3 голосов
/ 24 марта 2009

Оформить Smush.it! Он удалит всю информацию unnecs из изображения. Они имеют API , который можно использовать для обработки изображений.

Примечание: По типу он может изменить тип файла на вас. Это специально. Если другой тип файла может отображать то же изображение с тем же качеством, но с меньшим количеством байтов, это даст вам новый файл.

3 голосов
/ 24 марта 2009

Я думаю, вам нужно профилировать это. Возможно, вы правы в том, что сэкономите несколько ГБ, но это относительно мало на 2,5 ТБ полосы пропускания. Вам нужны реальные данные о том, что обслуживается больше всего, и работать над этим. Если вы обнаружите, что именно изображения посылают вам слишком широкую полосу пропускания, вы должны сначала проверить заголовки кэширования и 304 ответа, вы также можете попробовать использовать что-то вроде amazon S3 для обслуживания ваших изображений. Благодаря этому мне удалось значительно сократить расходы на пропускную способность.

Тем не менее, если данные EXIF ​​действительно имеют такое большое значение, то вы можете использовать библиотеку GD для копирования изображения в формате jpeg с помощью функции imagejpeg . Это не будет копировать данные EXIF.

2 голосов
/ 24 марта 2009

Эмиль Х, вероятно, лучше всего отвечает на этот вопрос.

Но я хотел добавить, что это почти наверняка не спасет вас так сильно, как вы думаете. Этот тип метаданных занимает очень мало места; Я думаю, что

  1. Повторное сжатие изображений до меньшего размера файла и
  2. Обрезка или изменение размера для уменьшения разрешения изображений

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

Если нет, вы всегда можете иметь вид по умолчанию в меньшем размере со ссылкой «увеличить». Большинство людей, которые просто просматривают, увидят уменьшенное изображение, и только те, кто хочет наибольший размер, нажмут, чтобы увеличить его, так что вы все равно получите почти всю экономию пропускной способности. Это то, что делает Flickr, например.

0 голосов
/ 23 июня 2009

Может быть разумно выполнить все манипуляции с изображениями на стороне клиента (с использованием Java-апплета, такого как Facebook), а затем, когда изображение сжимается, изменяется и полностью удаляет ненужные пиксели и контент, его можно загрузить на оптимальный размер, экономящий трафик и производительность на стороне сервера! (за счет первоначальной разработки)

0 голосов
/ 23 июня 2009

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

Просто интересно, можно ли это сделать, и если возможно, я напишу для этого класс php.

...