Ich habe versucht, das Limit programmgesteuert herauszufinden: Festlegen der Leinwandgröße ab 35000, Verringern um 100, bis eine gültige Größe gefunden wurde. Schreiben Sie in jedem Schritt das Pixel unten rechts und lesen Sie es dann. Es funktioniert - mit Vorsicht.
Die Geschwindigkeit ist akzeptabel, wenn entweder Breite oder Höhe auf einen niedrigen Wert (z. B. 10-200) eingestellt wird: get_max_canvas_size('height', 20)
.
Wenn get_max_canvas_size()
die erstellte Leinwand jedoch ohne Breite oder Höhe aufgerufen wird , ist die erstellte Leinwand so groß, dass das Lesen einer einzelnen Pixelfarbe sehr langsam ist und im IE zu ernsthaften Hängen führt.
Wenn dieser ähnliche Test auf irgendeine Weise durchgeführt werden könnte, ohne den Pixelwert zu lesen, wäre die Geschwindigkeit akzeptabel.
Natürlich ist der einfachste Weg, die maximale Größe zu ermitteln, eine native Methode, um die maximale Breite und Höhe abzufragen. Aber Leinwand ist 'ein Lebensstandard', also kann es sein, dass es eines Tages kommt.
http://jsfiddle.net/timo2012/tcg6363r/2/ (Achtung! Ihr Browser kann hängen bleiben!)
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
...