Canvas отлично работает во всех браузерах, кроме Chrome

У меня есть JS-скрипт, который берет изображение и рисует его на холсте. Код отлично работает во всех браузерах, кроме Chrome. Я включил соответствующие

    this.tile = document.createElement('canvas');
    var ctx = this.tile.getContext("2d");

    this.tile.width = ((size.cm_size) * (((this.image.width) / this.app.dpi.active) * 2.54)).toFixed(2);
    this.tile.height = ((size.cm_size) * (((this.image.height) / this.app.dpi.active) * 2.54)).toFixed(2);

    if (this.scale > 0) {
        // These 2 lines break it in Chrome.
        this.tile.width = this.tile.width * this.scale;
        this.tile.height = this.tile.height * this.scale;
    }

    ctx.drawImage(this.image, 0, 0, this.image.width, this.image.height, 0, 0, this.image.width, this.image.height);

Я прокомментировал 2 строки, которые ломают что-то в Chrome. Удаление этих строк заставляет вещи работать.

С этими строками ничего не отображается, пока я не увеличу переменную this.app.dpi.active до 350 (она начинается со 150). Как только это происходит, он отображает то же, что и в Firefox.

Сообщений об ошибках нет, плитка просто пуста.

Вот список значений для this.app.dpi.active, а также итоговая ширина и высота плитки. Плитка не отображается, пока значение DPI не достигнет 350.

150 DPI = 9444 x 9444
200 DPI = 7084 x 7084
250 DPI = 5668 x 5668
300 DPI = 4720 x 4720
350 DPI = 4048 x 4048

Я проверил эти значения в Chrome и Firefox, и они идентичны, но в Firefox все работает. Значение this.scale = 4, и когда ширина и высота не умножаются на this.scale, оно отлично работает в FF и Chrome.

Пожалуйста, дайте мне знать, если вам нужен дополнительный код или у вас есть вопросы.


person Ben Tideswell    schedule 24.07.2014    source источник
comment
new Element? Я не думаю, что вы можете сделать это. Вы должны на самом деле сделать document.createElement   -  person Derek 朕會功夫    schedule 25.07.2014
comment
Можете ли вы привести несколько примеров того, какими могут быть переменные? Если эти две строки нарушают код, то, вероятно, где-то есть проблема с математикой.   -  person hobberwickey    schedule 25.07.2014
comment
Я добавил значения. Они идентичны в FF и Chrome. Я также добавил ссылку на страницу, чтобы вы могли попробовать это в FF и Chrome.   -  person Ben Tideswell    schedule 25.07.2014


Ответы (2)


Я не думаю, что вы можете использовать конструктор Element. Я всегда использовал document.createElement('canvas'). В моей консоли FF использование конструктора Element вызывает ошибку.

person Nick Desaulniers    schedule 24.07.2014
comment
В Хроме тоже выдает ошибку. Возможно, OP создал свой собственный конструктор Element. - person Fabrício Matté; 25.07.2014
comment
Это Prototype.js, поэтому new Element('canvas') должен совпадать с document.createElement('canvas'). При этом я изменил код, чтобы использовать вашу версию, но ошибка точно такая же. - person Ben Tideswell; 25.07.2014

Хорошо, я понял это сам, но спасибо всем за ваш вклад!

Я заметил, что как только изображение достигает определенного размера, Chrome отображает его правильно. Это заставило меня поверить, что Chrome не позволяет использовать элементы холста определенного размера (вероятно, по причинам памяти/эффективности). Чтобы исправить это, я немного переработал свою систему, чтобы элементы холста никогда не становились слишком большими и поэтому всегда отображались правильно. Это устранило проблему в Chrome и сделало мою систему немного быстрее.

person Ben Tideswell    schedule 26.07.2014