J'ai essayé de déterminer par programme la limite: définir la taille de la toile à partir de 35000, descendre de 100 jusqu'à ce qu'une taille valide soit trouvée. À chaque étape, écrire le pixel en bas à droite, puis le lire. Cela fonctionne - avec prudence.
La vitesse est acceptable si la largeur ou la hauteur est réglée sur une valeur faible (par exemple 10-200) de cette façon: get_max_canvas_size('height', 20)
.
Mais s'il est appelé sans largeur ou hauteur comme get_max_canvas_size()
, le canevas créé est si grand que la lecture de la couleur SINGLE pixel est très lente, et dans IE provoque un sérieux blocage.
Si ce test pouvait être fait d'une manière ou d'une autre sans lire la valeur des pixels, la vitesse serait acceptable.
Bien sûr, le moyen le plus simple de détecter la taille maximale serait un moyen natif d'interroger la largeur et la hauteur maximales. Mais Canvas est «un niveau de vie», donc peut-être arrivera-t-il un jour.
http://jsfiddle.net/timo2012/tcg6363r/2/ (Attention, votre navigateur peut se bloquer!)
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
...