Подтвердить что ты не робот

Base 64 encode vs загрузка файла изображения

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

<img src="data:image/jpeg;base64,/9j/4AAQ..." />

Что поддерживается в FireFox и других браузерах Gecko.

Итак, чтобы повторить, было бы быстрее передать фактический файл изображения или код base64. Будет ли потребоваться меньше HTTP-запроса при использовании ajax для загрузки изображений?

Изображения будут не более 100 пикселей.

4b9b3361

Ответ 1

Хорошо, я не согласен ни с кем из вас. Бывают случаи, когда вы загружаете все больше и больше изображений. Не все страницы содержат 3 изображения. На самом деле я работаю над сайтом, где вы загружаете более 200 изображений. Что происходит, когда 100000 пользователей запрашивают 200 изображений на очень загруженном сайте. Диски сервера, возвращающие изображения, должны разрушаться. Еще хуже, что вы должны сделать так много запросов на сервер, а не на base64. Для большого количества эскизов я предпочел бы представление base64, предварительно сохраненное в базе данных. Я нашел решение и сильную аргументацию в http://www.stoimen.com/blog/2009/04/23/when-you-should-use-base64-for-images/. Парень действительно в этом случае и сделал несколько тестов. Я был впечатлен и сделал свои тесты. Реальность такова, как она говорит. Для так много изображений, загруженных на одну страницу, очень полезен один ответ с сервера.

Ответ 2

  • Кодировка Base64 делает файл более крупным и, следовательно, более медленным для переноса.
  • Включая изображение на странице, его нужно загружать каждый раз. Внешние изображения обычно загружаются только один раз, а затем кэшируются браузером.
  • Он несовместим со всеми браузерами

Ответ 3

Не думайте, что data:// работает в IE7 или ниже.

Когда изображение запрашивается, вы можете сохранить его в файловой системе, а затем выполнить его с тех пор. Если данные изображения в базе данных меняются, просто удалите файл. Подавайте его из другого домена, также как img.domain.com. Вы можете получить все преимущества последних изменений или электронных тегов бесплатно с вашего веб-сервера без необходимости запуска PHP, если вам тоже не нужно.

Если вы используете apache:

# If the file doesn't exist:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(image123).jpg$ makeimage.php?image=$1

Ответ 4

Зачем регенерировать изображение снова и снова, если он не будет изменен. Гипотетически, даже если есть 1000 различных возможных изображений, которые будут показаны на основе 1000 различных условий, я все же думаю, что 1000 изображений на дисках лучше. Помните, что изображения на основе дисков могут кэшироваться браузером и сохранять пропускную способность и т.д. И т.д.

Ответ 5

Это очень быстрое и простое решение. Хотя размер изображения увеличится примерно на 33%, использование base64 значительно сократит количество HTTP-запросов.

Изображения Google и изображения Yahoo используют base64 и служат для изображений изображений inline. Проверьте исходный код, и вы увидите его.

Конечно, есть недостатки в этом подходе, но я считаю, что выгоды перевешивают затраты. Недостатки, которые я обнаружил, находятся в медленных устройствах. Например, в iPhone 3GS изображения, обслуживаемые изображениями Google, очень медленны для рендеринга, так как изображения выходят из сервера и должны быть несжаты в браузере. Таким образом, если клиент имеет медленное устройство, он немного пострадает при визуализации изображений.

Ответ 6

Как правило, использование base64-кодирования будет увеличивать размер байта примерно на 1/3. Из-за этого вам нужно будет перенести 1/3 байта из базы данных на сервер, а затем переместить эти дополнительные одинаковые 1/3 байта по проводу в браузер.

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

Считая, что это хорошая идея, чтобы сменить файлы на свои байтовые представления в db и передать их.

Ответ 7

Чтобы ответить на начальный вопрос, я проверил тест, измеряя изображение в формате JPEG 400x300 px в 96 ppi:

base64ImageData.Length
177732

bitmap.Length
129882

Ответ 8

Если вам нужна самая быстрая скорость, вы должны записать их на диск, когда они будут загружены/изменены, и пусть веб-сервер будет обслуживать статические файлы. Предложения Rojoca тоже хороши, поскольку они сводят к минимуму вызов php. Дополнительным преимуществом обслуживания из другого домена является (большинство) браузеров будет выдавать запросы параллельно.

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

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

Ответ 9

Я использовал изображения base64 один или два раза для значков (10x10 пикселей или около того).

Изображения Base64:

  • compact - у вас есть один файл. также, если файл сжат, изображение base64 сжимается почти до размера обычного изображения. Страница
  • извлекается в одном запросе.

Изображения Base64 минус:

  • чтобы быть реалистичным, вам, вероятно, нужно использовать скриптовый движок (такой PHP) на всех страницах, содержащих изображение.
  • Если изображение изменено, все кэшированные страницы должны быть повторно загружены.
  • поскольку изображение встроено, вы не можете использовать веб-сервер CDN или статического контента.

Обычные изображения:

  • Если вы используете протокол SPDY, по крайней мере, теоретические, страницы + изображения + CSS будут загружаться с одним запросом.
  • вы можете установить срок действия изображения, поэтому контент будет кэшироваться из браузеров.