Я работаю с элементом холста высотой 600
до 1000
пикселей и шириной в несколько десятков или сотен тысяч пикселей. Однако после определенного количества пикселей (очевидно, неизвестного) холст больше не отображает фигуры, которые я рисую с помощью JS.
Кто-нибудь знает, есть ли предел?
Протестировано как в Chrome 12, так и в Firefox 4.
javascript
html
canvas
серьезный дев
источник
источник
tens OR hundreds of thousands
...Ответы:
Обновлено 13.10.2014
Все протестированные браузеры имеют ограничения по высоте / ширине элементов холста, но многие браузеры также ограничивают общую площадь элемента холста. Ограничения для браузеров, которые я могу тестировать, следующие:
Хром:
Максимальная высота / ширина: 32 767 пикселей.
Максимальная площадь: 268 435 456 пикселей (например, 16 384 x 16 384)
Fire Fox:
Максимальная высота / ширина: 32 767 пикселей
Максимальная площадь: 472 907 776 пикселей (например, 22 528 x 20 992)
IE:
Максимальная высота / ширина: 8192 пикселей
Максимальная площадь: N / A
IE Mobile:
Максимальная высота / ширина: 4096 пикселей
Максимальная площадь: N / A
Другой:
В настоящее время я не могу тестировать другие браузеры. Дополнительные ограничения см. В других ответах на этой странице.
Превышение максимальной длины / ширины / площади в большинстве браузеров делает холст непригодным для использования. (Он будет игнорировать любые команды рисования, даже в полезной области.) IE и IE Mobile будут учитывать все команды рисования в пределах используемого пространства.
источник
<canvas>
элементов и автоматически применяла инструкции рисования к соответствующему контексту.Я столкнулся с ошибками нехватки памяти в Firefox с высотой холста более 8000, хром, похоже, обрабатывает намного больше, по крайней мере, до 32000.
РЕДАКТИРОВАТЬ: Проведя еще несколько тестов, я обнаружил очень странные ошибки в Firefox 16.0.2.
Во-первых, мне кажется, что поведение холста в памяти (созданного в javascript) отличается от поведения холста, объявленного в HTML.
Во-вторых, если у вас нет правильного тега html и мета-кодировки, холст может быть ограничен до 8196, в противном случае вы можете подняться до 32767.
В-третьих, если вы получите двумерный контекст холста, а затем измените размер холста, вы также можете быть ограничены до 8196. Простая установка размера холста перед захватом 2-мерного контекста позволяет получить до 32767 без ошибок памяти.
Мне не удавалось постоянно получать ошибки памяти, иногда это только при загрузке первой страницы, а затем срабатывают последующие изменения высоты. Это html-файл, который я тестировал с помощью http://pastebin.com/zK8nZxdE .
источник
Максимальный размер холста iOS (ширина x высота):
протестирован в марте 2014 г.
источник
Чтобы немного расширить ответ на @FredericCharette: в соответствии с руководством по содержанию сафари в разделе «Знайте ограничения ресурсов iOS»:
Следовательно, любое изменение размера в 5242880 (5 x 1024 x 1024) пикселей будет работать на больших устройствах памяти, в противном случае это 3145728 пикселей.
Пример для 5-мегапиксельного холста (ширина x высота):
и так далее..
Самые большие КВАДРАТНЫЕ полотна ("MiB" = 1024x1024 байта):
источник
Обновление на 2018 год:
Время идет, и ограничения холста меняются. К сожалению, не изменилось то, что браузер по-прежнему не предоставляет информацию об ограничениях размера холста через Canvas API.
Для тех, кто хочет программным образом определить максимальный размер холста браузера или протестировать поддержку пользовательских размеров холста, ознакомьтесь с размером холста .
Из документов:
Демонстрационная ссылка и результаты тестирования доступны в README , а также в разделе известных проблем, который затрагивает вопросы производительности и виртуальных машин.
Полное раскрытие, я являюсь автором библиотеки. Я создал его еще в 2014 году и недавно пересмотрел код для нового проекта, связанного с холстом. Я был удивлен, обнаружив такое же отсутствие доступных инструментов для обнаружения ограничений размера холста в 2018 году, поэтому я обновил код, выпустил его и надеюсь, что он поможет другим, сталкивающимся с аналогичными проблемами.
источник
Согласно спецификациям w3 , интерфейс ширина / высота является беззнаковым длинным - поэтому от 0 до 4 294 967 295 (если я правильно помню это число - может быть несколько).
РЕДАКТИРОВАТЬ: Как ни странно, он говорит, что unsigned long, но тестирование показывает только нормальное длинное значение как max: 2147483647. Jsfiddle - 47 работает, но до 48, и он возвращается к значению по умолчанию.
источник
Несмотря на то, что холст позволяет вам поставить высоту = 2147483647, когда вы начнете рисовать, ничего не произойдет
Рисование происходит только тогда, когда я возвращаю высоту к 32767
источник
iOS имеет другие ограничения.
Используя симулятор iOS 7, я смог продемонстрировать, что ограничение составляет 5 МБ следующим образом:
но если я увеличу размер холста на одну строку пикселей:
источник
На ПК -
я не думаю, что есть ограничение, но да, вы можете получить исключение из памяти.
На мобильных устройствах.
Вот ограничения для холста для мобильных устройств: -
Максимальный размер элемента холста составляет 3 мегапикселя для устройств с объемом ОЗУ менее 256 МБ и 5 мегапикселей для устройств с объемом ОЗУ не менее 256 МБ.
Так, например, если вы хотите поддерживать старое оборудование Apple, размер вашего холста не может превышать 2048 × 1464.
Надеюсь, эти ресурсы помогут вам вытащить вас.
источник
Ограничения для Safari (все платформы) намного ниже.
Известные ограничения iOS / Safari
Например, у меня был буфер холста размером 6400x6400 пикселей с нарисованными на нем данными. Отслеживая / экспортируя контент и тестируя в других браузерах, я смог убедиться, что все в порядке. Но в Safari он пропустит отрисовку этого конкретного буфера в моем основном контексте.
источник
Я попытался программно определить предел: установив размер холста, начиная с 35000, уменьшив его на 100, пока не был найден допустимый размер. На каждом этапе записываем правый нижний пиксель, а затем читаем его. Работает - с осторожностью.
Скорость приемлема , если либо ширина или высота установлена в некоторой малой величины (например , 10-200.) Следующим образом:
get_max_canvas_size('height', 20)
.Но при вызове без ширины или высоты
get_max_canvas_size()
созданный холст настолько велик, что чтение ОДНОГО цвета пикселя происходит очень медленно, а в IE вызывает серьезное зависание.Если бы такой тест можно было как-то провести без считывания значения пикселя, скорость была бы приемлемой.
Конечно, самый простой способ определить максимальный размер - это какой-нибудь собственный способ запросить максимальную ширину и высоту. Но Canvas - это «уровень жизни», так что может быть, когда-нибудь он появится.
http://jsfiddle.net/timo2012/tcg6363r/2/ (Имейте в виду, ваш браузер может зависнуть!)
источник
Когда вы используете полотна WebGL, браузеры (включая настольные) накладывают дополнительные ограничения на размер базового буфера. Даже если ваш холст большой, например 16 000x16 000, большинство браузеров будут отображать меньшее (скажем, 4096x4096) изображение и увеличивать его. Это может вызвать некрасивую пикселизацию и т. Д.
Я написал код, чтобы определить этот максимальный размер с помощью экспоненциального поиска, если это кому-нибудь понадобится.
determineMaxCanvasSize()
- это интересующая вас функция.Также в jsfiddle https://jsfiddle.net/1sh47wfk/1/
источник
Вы можете разбить его на части, и в javascript auto добавить столько холстов меньшего размера, сколько необходимо, и нарисовать элементы на соответствующем холсте. В конечном итоге у вас все равно может закончиться память, но вы получите ограничение на один холст.
источник
Я не знаю, как определить максимально возможный размер без итерации, но вы можете определить, работает ли данный размер холста, заполнив пиксель и затем прочитав цвет обратно. Если холст не отрисован, цвет, который вы получите, не будет совпадать. W
частичный код:
источник