मैंने प्रोग्रामेटिक रूप से सीमा का पता लगाने की कोशिश की: 35000 से शुरू होने वाले कैनवास के आकार को सेट करना, जब तक वैध आकार नहीं मिल जाता, तब तक 100 से नीचे जाना। हर स्टेप में राइट-बॉटम पिक्सेल लिखना और फिर उसे पढ़ना। यह काम करता है - सावधानी के साथ।
गति स्वीकार्य है अगर या तो चौड़ाई या ऊंचाई कुछ कम मूल्य (जैसे 10-200) पर सेट है get_max_canvas_size('height', 20)।
लेकिन अगर चौड़ाई या ऊँचाई के बिना कहा जाता है get_max_canvas_size(), तो बनाया गया कैनवास इतना बड़ा है कि SINGLE पिक्सेल रंग पढ़ना बहुत धीमा है, और IE में गंभीर हैंग होता है।
यदि इस तरह का परीक्षण पिक्सेल मूल्य को पढ़े बिना किसी दिन किया जा सकता है, तो गति स्वीकार्य होगी।
बेशक अधिकतम आकार का पता लगाने का सबसे आसान तरीका अधिकतम चौड़ाई और ऊंचाई को क्वेरी करने का कुछ मूल तरीका होगा। लेकिन कैनवस 'एक जीवन स्तर है', इसलिए हो सकता है कि यह किसी दिन आ रहा हो।
http://jsfiddle.net/timo2012/tcg6363r/2/ (जागरूक रहें! आपका ब्राउज़र हैंग हो सकता है!)
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...