фоновое изображение шириной более 100 тыс. пикселей

У меня есть лист спрайтов, который я использую в качестве фона div. Размеры:

Ширина: 105920 Высота: 240 .

Это монохромный файл png размером 620 КБ, поэтому я предполагаю, что размер здесь не проблема.

Когда я пытаюсь использовать его как background-image: url("spritesheet.png");, Firefox выдает ошибку «Изображение повреждено или усечено». Chrome не показывает никаких сообщений об ошибках, но изображение не отображается.

Если я изменяю ширину изображения с помощью GIMP до 10 000, все в порядке. но, очевидно, я больше не могу использовать его по назначению.

Существуют ли какие-либо ограничения на максимально допустимый размер изображения в CSS? Я делаю что-то неправильно ?


person Alexander    schedule 21.11.2013    source источник
comment
Здесь может быть первоначальный ответ (но для мобильных устройств)... stackoverflow.com/questions/9046143/   -  person FBHY    schedule 21.11.2013
comment
Я не думаю, что в CSS есть какие-то ограничения на размер bg. Я использовал изображения размером 1 МБ, и они работали нормально. Можете ли вы попробовать сохранить файл из Fireworks? Приложение имеет множество настроек для сохранения png.   -  person fauverism    schedule 21.11.2013
comment
Пробовал фейерверк, та же проблема...   -  person Alexander    schedule 21.11.2013


Ответы (2)


Согласно ответу на этот вопрос, ваше изображение слишком большой для Safari/iOS. Другие браузеры, вероятно, имеют аналогичные ограничения, как вы обнаружили в Firefox. Размер файла 620 КБ приемлем, но размеры изображения (более 25 миллионов пикселей) слишком велики для обработки.

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

person Mark Simpson    schedule 21.11.2013

Не решение вашей проблемы, просто комментарий. Преимущества использования спрайт-листов могут быть потеряны или сильно уменьшены, если вы ориентируете их горизонтально. Это вызывает проблему с кэш-промахами.

Представьте, что у вас есть спрайт размером 10x10 пикселей. Чтобы загрузить часть вашего изображения, содержащую его, вам нужно загрузить (numPixels = sprite_height * src_width). В вашем случае это будет 10 x 105920 пикселей = 1 059 200 пикселей! - Только для кэширования изображения размером 100 пикселей.

Лучший способ ориентировать лист спрайтов — вертикально. Вы используете то же уравнение для определения количества пикселей, которые должны быть загружены, но получаете совсем другой результат. Результат, который теперь достаточно мал, чтобы поместиться в самый маленький (самый быстрый) кеш. В данном случае: 10 x 240 пикселей = 2400 пикселей. - Опять же, излишество всего для 100 пикселей, но решение лучше, чем дает предыдущий пример.

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

Эффект от внесения этого изменения будет наиболее заметен при многократном рисовании одного и того же спрайта или спрайтов, расположенных рядом друг с другом на листе спрайтов.

Учитывая, что браузер работает с полноцветными изображениями на экране, вполне разумно предположить, что из соображений производительности браузер преобразует ваше монохромное изображение в изображение, совместимое с остальной частью экрана, т. пиксель, хотя и с (относительно) небольшим изменением значения. Если бы изображение действительно было преобразовано в 24-битное, требования к памяти были бы огромными 105920 * 240 * 3 = 76262400 байт. Да!! Это 72,73 мегабайта!! Добавьте еще 1/3, если оно преобразовано в изображение rgba (32 бита).

Итак, у меня есть два предложения.

  1. Расположите ваши изображения вертикально
  2. Используйте несколько листов спрайтов.
person enhzflep    schedule 21.11.2013