Maximum size of a element

后端 未结 14 1920
粉色の甜心
粉色の甜心 2020-11-22 07:34

I\'m working with a canvas element with a height of 600 to 1000 pixels and a width of several tens or hundreds of thousands of pixels. However, aft

14条回答
  •  执笔经年
    2020-11-22 08:08

    I tried to programmatically figure out the limit: setting canvas size starting from 35000, stepping down by 100 until valid size is found. In every step writing the right-bottom pixel and then reading it. It works - with caution.

    The speed is acceptable if either width or height is set to some low value (eg. 10-200) this way: get_max_canvas_size('height', 20).

    But if called without width or height like get_max_canvas_size(), the created canvas is so big that reading SINGLE pixel color is very slow, and in IE causes serious hang.

    If this like test could be done someway without reading pixel value, the speed would be acceptable.

    Of course the easiest way to detect maximum size would be some native way to query the max width and height. But Canvas is 'a living standard', so may be it is coming some day.

    http://jsfiddle.net/timo2012/tcg6363r/2/ (Be aware! Your browser may hang!)

    if (!Date.now)
    {
      Date.now = function now()
      {
        return new Date().getTime();
      };
    }
    
    var t0 = Date.now();
    //var size = get_max_canvas_size('width', 200);
    var size = get_max_canvas_size('height', 20);
    //var size = get_max_canvas_size();
    var t1 = Date.now();
    var c = size.canvas;
    delete size.canvas;
    $('body').append('time: ' + (t1 - t0) + '
    max size:' + JSON.stringify(size) + '
    '); //$('body').append(c); function get_max_canvas_size(h_or_w, _size) { var c = document.createElement('canvas'); if (h_or_w == 'height') h = _size; else if (h_or_w == 'width') w = _size; else if (h_or_w && h_or_w !== 'width' && h_or_w !== 'height' || !window.CanvasRenderingContext2D) return { width: null, height: null }; var w, h; var size = 35000; var cnt = 0; if (h_or_w == 'height') w = size; else if (h_or_w == 'width') h = size; else { w = size; h = size; } if (!valid(w, h)) for (; size > 10; size -= 100) { cnt++; if (h_or_w == 'height') w = size; else if (h_or_w == 'width') h = size; else { w = size; h = size; } if (valid(w, h)) break; } return { width: w, height: h, iterations: cnt, canvas: c }; function valid(w, h) { var t0 = Date.now(); var color, p, ctx; c.width = w; c.height = h; if (c && c.getContext) ctx = c.getContext("2d"); if (ctx) { ctx.fillStyle = "#ff0000"; try { ctx.fillRect(w - 1, h - 1, 1, 1); p = ctx.getImageData(w - 1, h - 1, 1, 1).data; } catch (err) { console.log('err'); } if (p) color = p[0] + '' + p[1] + '' + p[2]; } var t1 = Date.now(); if (color == '25500') { console.log(w, h, true, t1 - t0); return true; } console.log(w, h, false, t1 - t0); return false; } }

提交回复
热议问题