- From: Anssi Kostiainen <anssi.kostiainen@nokia.com>
- Date: Fri, 4 Dec 2009 17:59:31 +0200
- To: ext Robin Berjon <robin@robineko.com>
- Cc: "Oksanen Ilkka (Nokia-D/Espoo)" <Ilkka.Oksanen@nokia.com>, public-device-apis <public-device-apis@w3.org>
On 4.12.2009, at 16.52, ext Robin Berjon wrote: > On Dec 4, 2009, at 15:23 , Ilkka Oksanen wrote: >> To keep things simple in v1.0 most of the configuration could happen >> through UI in native side. Resolution (and quality) setting is a >> special >> case in a sense that it affects directly to the file size. Following >> could happen more often if there is no way of hinting the preffered >> resolution in the API. >> >> - A widget allows user to set profile picture, max resolution is >> 640x480 >> - Native camera has the default resolution of 1600x1200 >> - User doesn't change resolution and takes the profile image >> - Widget uploads the image to server >> - Server shrinks the image -> Bandwith wasted. > > There's an API for that! > > You would: > > - get the image somehow > - assign it to an <img> element (visible or not); alternatively, > get a way of extracting HTML5 ImageData from it) > - if it's the right size or less, you're good, otherwise continue > - create a canvas element of the desired size, get its 2D context > - use c2d.drawImage(yourImg, 0, 0, width, height) (or putImageData > if you have ImageData) > - then return c2d.getImageData(), or c2d.toDataURL(), or whatever > newish thing that can return properly encoded image content > > Not perfect, but workable. > An ability to set a [lower] resolution would also help to minimize the run-time memory allocation which should make apps more responsive and generally perform better. I'm sure using a canvas element is not the most efficient way to resize images albeit I like your creative approach ;) I agree that the lack of a resolution option is less of an issue on {desk|lap}tops which have a faster CPU, plenty of memory and typically rather modest camera optimized for video conferencing. Canvas resizing would probably work pretty well in such scenarios. Regardless, IMHO we should at least think the potential performance implications a bit too (the lack of a quality option is less of an issue as it has less variation and more reasonable defaults across devices). If we were to add an optional resolution option and would like to mold the API a bit to be more extensible I'd propose something similar to Geolocation: [Supplemental, NoInterfaceObject] interface Capture { readonly attribute sequence<FormatData> supportedImageFormats; readonly attribute sequence<FormatData> supportedVideoFormats; readonly attribute sequence<FormatData> supportedAudioFormats; PendingOperation captureImage (in CaptureCB successCB, in optional CaptureErrorCB errorCB, in optional captureImageOptions); PendingOperation captureVideo (in CaptureCB successCB, in optional CaptureErrorCB errorCB, in optional captureVideoOptions); PendingOperation captureAudio (in CaptureCB successCB, in optional CaptureErrorCB errorCB, in optional captureAudioOptions); }; [NoInterfaceObject] interface captureImageOptions { attribute unsigned long limit; attribute double duration; attribute unsigned short width; // [0, 65535] should be enough? attribute unsigned short height; // ditto ("640k is enough for everyone" etc.) }; // ... the same for captureVideoOptions and captureAudioOptions -Anssi
Received on Friday, 4 December 2009 15:58:47 UTC