Saya mencoba untuk secara terprogram mencari tahu batasnya: mengatur ukuran kanvas mulai dari 35000, turun 100 hingga ukuran yang valid ditemukan. Di setiap langkah tulis piksel kanan bawah dan kemudian membacanya. Ini bekerja - dengan hati-hati.
Kecepatan diterima jika salah lebar atau tinggi diatur untuk beberapa nilai rendah (misalnya 10-200.) Dengan cara ini: get_max_canvas_size('height', 20)
.
Tetapi jika disebut tanpa lebar atau tinggi seperti get_max_canvas_size()
, kanvas yang dibuat sangat besar sehingga pembacaan warna piksel TUNGGAL sangat lambat, dan di IE menyebabkan hang yang serius.
Jika tes seperti ini dapat dilakukan bagaimanapun tanpa membaca nilai piksel, kecepatannya akan dapat diterima.
Tentu saja cara termudah untuk mendeteksi ukuran maksimum adalah dengan cara asli untuk menanyakan lebar dan tinggi maksimum. Tapi Canvas adalah 'standar hidup', jadi mungkin itu akan datang suatu hari nanti.
http://jsfiddle.net/timo2012/tcg6363r/2/ (Hati-hati! Browser Anda mungkin macet!)
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
...