ฉันพยายามหาขีด จำกัด โดยใช้โปรแกรม: การตั้งค่าขนาดแคนวาสเริ่มจาก 35000 ลดลง 100 จนกว่าจะพบขนาดที่ถูกต้อง ในทุกขั้นตอนการเขียนพิกเซลด้านขวาล่างแล้วอ่าน ใช้งานได้ - ด้วยความระมัดระวัง
ความเร็วเป็นที่ยอมรับได้หากตั้งค่าความกว้างหรือความสูงเป็นค่าต่ำ (เช่น 10-200) ด้วยวิธีนี้: get_max_canvas_size('height', 20)
ด้วยวิธีนี้:
แต่ถ้าเรียกโดยไม่มีความกว้างหรือความสูงเช่นget_max_canvas_size()
ผืนผ้าใบที่สร้างขึ้นจะมีขนาดใหญ่มากจนการอ่านสีพิกเซลเดียวจะช้ามากและใน 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
...