Traté de averiguar el límite mediante programación: estableciendo el tamaño del lienzo a partir de 35000, reduciendo en 100 hasta que se encuentre un tamaño válido. En cada paso, escriba el píxel inferior derecho y luego lo lea. Funciona con precaución.
La velocidad es aceptable si cualquiera de anchura o altura se establece en un valor bajo (por ejemplo 10-200.) De esta manera: get_max_canvas_size('height', 20)
.
Pero si se llama sin ancho o alto get_max_canvas_size()
, el lienzo creado es tan grande que leer el color de UN SOLO píxel es muy lento y, en IE, se bloquea gravemente.
Si esta prueba similar se pudiera realizar de alguna manera sin leer el valor de los píxeles, la velocidad sería aceptable.
Por supuesto, la forma más fácil de detectar el tamaño máximo sería alguna forma nativa de consultar el ancho y la altura máximos. Pero Canvas es 'un estándar de vida', por lo que puede que llegue algún día.
http://jsfiddle.net/timo2012/tcg6363r/2/ (¡Tenga en cuenta que su navegador puede bloquearse!)
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) + '<br>max size:' + JSON.stringify(size) + '<br>');
//$('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;
}
}
tens OR hundreds of thousands
...