- From: Philip Taylor <pjt47@cam.ac.uk>
- Date: Thu, 05 Jun 2008 16:47:33 +0100
- To: Anne van Kesteren <annevk@opera.com>
- CC: HTML WG <public-html@w3.org>
Anne van Kesteren wrote: > > At Opera we're planning on adding support to <canvas> for JPEG as export > format. To make the file size reasonable there needs to be a way to set > the quality level of the JPEG. [...] > > One simple solution to this which is reasonably consistent with the rest > of the <canvas> API is to add a jpegQuality DOM attribute to the > <canvas> element which takes an integer in the range 0-1 (similar to > globalAlpha). [...] The spec already suggests a mechanism for this: http://www.whatwg.org/specs/web-apps/current-work/multipage/#todataurl "Arguments other than the type must be ignored, and must not cause the user agent to raise an exception (as would normally occur if a method was called with the wrong number of arguments). A future version of this specification will probably allow extra parameters to be passed to toDataURL() to allow authors to more carefully control compression settings, image metadata, etc." So this would be toDataURL('image/jpeg', 0.75); which seems nicer to me, since it keeps the parameter-setting and parameter-using code in one place (hence making the code easier to understand, with fewer invisible dependencies), and there's only this single parameter for JPEG and shouldn't be any more in the future (and so there isn't a real danger of the function-parameter API getting horribly long). Firefox 2/3 violates the spec (https://bugzilla.mozilla.org/show_bug.cgi?id=401795) and throws a security exception when there's an extra argument to toDataURL, so actually you'd have to write a try/catch block and fall back if the call fails; but you'll have to use try/catch anyway, even with ctx.jpegQuality, because Firefox always throws if the first argument is not image/png (instead of falling back to PNG as per spec). So the real code would be more like: var data; try { data = ctx.toDataURL('image/jpeg', 0.75); } catch (e) { try { data = ctx.toDataURL(); } catch (e) { alert('Sorry, your browser does not support saving this image.'); } } (and using .jpegQuality would have the same exception-handling complexity, so there's no real difference.) -- Philip Taylor pjt47@cam.ac.uk
Received on Thursday, 5 June 2008 15:48:18 UTC