Sınırı programlı bir şekilde anlamaya çalıştım: 35000'den başlayarak tuval boyutunu ayarlama, geçerli boyut bulunana kadar 100 azaltma. Her adımda sağ alttaki pikseli yazıp sonra okuyoruz. Çalışır - dikkatli.
Her iki genişlik veya yükseklik bir düşük değeri (örn. 10-200) bu şekilde ayarlanırsa, hızı kabul edilebilir: get_max_canvas_size('height', 20)
.
Ancak, genişlik veya yükseklik olmadan çağrılırsa get_max_canvas_size()
, oluşturulan tuval o kadar büyüktür ki TEK piksel rengini okumak çok yavaştır ve IE'de ciddi takılmalara neden olur.
Bu gibi bir test piksel değeri okunmadan bir şekilde yapılabilirse, hız kabul edilebilir olacaktır.
Elbette maksimum boyutu tespit etmenin en kolay yolu, maksimum genişliği ve yüksekliği sorgulamanın yerel bir yolu olacaktır. Ancak tuval 'bir yaşam standardıdır', bu yüzden bir gün gelecek olabilir.
http://jsfiddle.net/timo2012/tcg6363r/2/ (Dikkat edin! Tarayıcınız kilitlenebilir!)
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
...