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

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

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

Как я это делаю сейчас? Как вы думаете, какой из них лучше?

Это общий вопрос для веб-приложений, без конкретного языка.

Есть идеи, как это сделать в Facebook или Google?

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


person ShuklaSannidhya    schedule 07.02.2013    source источник


Ответы (5)


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

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

person datasage    schedule 07.02.2013
comment
Дешево относительно того, где вы находитесь. - person datasage; 07.02.2013
comment
Это намного дешевле, чем вычислительная мощность / память. - person Ed Heal; 07.02.2013
comment
Вы также можете отметить, что, поскольку ВЫ создаете эскиз при загрузке, вы можете выбрать формат изображения (jpg) и размер. Миниатюры должны быть очень маленькими, поэтому я предполагаю, что они будут занимать несколько килобайт на диске, что по сравнению с исходным размером изображения почти ничего. Я не думаю, что это должно быть проблемой. - person Erenor Paz; 07.02.2013
comment
@datasage - 100 долларов в Microcentre (это близко вам по вашему профилю) за 2 ТБ (63 фунта стерлингов). Миниатюра, скажем, 30 КБ - их можно получить много в 2 ТБ. - person Ed Heal; 07.02.2013
comment
@EdHeal 7500 индийских рупий за 2 ТБ :(. - person ShuklaSannidhya; 07.02.2013
comment
Если вы имеете дело с хранилищем любого масштаба, вам необходимо учитывать пропускную способность ввода-вывода и репликацию. Если вы выберете действительно дешевые диски, вы можете потратить много времени (а это деньги) на их замену. Вам также необходимо учитывать стоимость рейд-контроллеров и корпусов для размещения дисков. - person datasage; 07.02.2013
comment
@datasage - я, например, делал. Но жесткие диски любого типа намного дешевле, чем покупка вычислительной мощности и памяти. Вот почему емкость жесткого диска намного превышает объем памяти вашего компьютера. - person Ed Heal; 07.02.2013
comment
... Забыл упомянуть, что клиент нетерпелив и гораздо быстрее просто доставить файл (эскиз) с диска, чем бедняга, ожидающий (снова ?!), чтобы вы изменили его размер. - person Ed Heal; 07.02.2013

Просто создайте уменьшенную версию и сохраните на диск. Место на жестком диске очень дешевое. 70 фунтов за пару ТБ.

person Ed Heal    schedule 07.02.2013
comment
@ SandyLee_user53167 ... И это дорого по сравнению с большей вычислительной мощностью / памятью? - person Ed Heal; 07.02.2013
comment
Код выглядит аккуратнее. <img src="thumbnail.php?image=image/foobar.jpg" выглядит чище, чем <img src="images/thumbnail/foobar.jpg".... И не забыть дополнительную строку для хранения миниатюрной версии изображения во время загрузки ... любая идея, как это делает facebook? - person ShuklaSannidhya; 07.02.2013
comment
@ SandyLee_user53167 - Просто создайте миниатюру при загрузке изображения. На создание может уйти секунда или две. Кстати - Почему thumbnail.php?image=image/foobar.jpg выглядит аккуратнее? Если это так, изучите правила перезаписи Apache. - person Ed Heal; 07.02.2013

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

person Hendyanto    schedule 07.02.2013
comment
Я конвертирую изменение размера изображения на стороне сервера, чтобы клиент получил изображение небольшого размера. - person ShuklaSannidhya; 07.02.2013

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

Это восходит к старинной поговорке «делай то, что делает Google», но с CMS.

person Millard    schedule 07.02.2013
comment
большинство CMS ... вы имеете в виду wordpress и drupal? - person ShuklaSannidhya; 07.02.2013

«Лучше» зависит от установленных вами критериев.

Для большинства приложений дисковое пространство не является проблемой - и если сохранение эскиза является проблемой, сохранение оригинала должно быть огромной проблемой - приличная фотография цифровой камеры будет занимать много мегабайт, тогда как эскиз не должен превышать 50 КБ.

Пропускная способность и производительность (с точки зрения клиента) обычно вызывают большее беспокойство. Если у вас много людей, просматривающих галерею миниатюр изображений, обслуживание миниатюр размером 50 КБ будет значительно быстрее (и дешевле по пропускной способности), чем обслуживание изображений с высоким разрешением в несколько мегабайт.

Кроме того, обслуживая эскизы по URL-адресу, например <img src="images/thumbnail/foobar.jpg">, и задавая соответствующие заголовки кеша, вы должны получить много нисходящего кэширования - это менее вероятно, если вы обслуживаете изображение как <img src="thumbnail.php?image=image/foobar.jpg>, потому что кеши обрабатывают строки запроса довольно консервативно.

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

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

person Neville Kuyt    schedule 07.02.2013
comment
Просто дайте оригиналу + миниатюре уникальный номер, чтобы больше не использовать его. Пользователь загружает новое изображение - этому изображению присваивается новый номер - теперь кеш будет работать только для нового изображения Simple. - person Ed Heal; 07.02.2013