[whatwg] toDataURL() for image/video?
Charles Pritchard
chuck at jumis.com
Fri Jun 15 19:42:26 PDT 2012
On Jun 15, 2012, at 7:10 PM, Ian Hickson <ian at hixie.ch> wrote:
> On Tue, 29 May 2012, Ashley Gullen wrote:
>>
>> Has toDataURL() (from canvas) been considered for ordinary image and
>> video elements? Seems like it would be useful for pure javascript
>> applications. Currently it can be done by creating a new canvas, getting
>> a 2D context, drawImage(), then canvas.toDataURL(). However adding it
>> to images directly would be a useful convenience method, avoid the
>> performance overhead of a new canvas, and probably be straightforward to
>> define/implement.
>>
>> Use cases for myimage.toDataURL():
>> - deep copy an image (imga.src = imgb.toDataURL())
>
> Why can't you do imga.src = imgb.src?
>
>> - send an image in JSON data
>
> Why can't you just send the URL?
>
> If you really can't, then you can still just fetch the image data using
> XHR, and then send the blob directly, which seems more efficient than
> requiring the UA to decode the image then reencode it as a PNG.
It's a bit of extra work and won't be "compatible" with the img setsrc technique. I think this is just a rehash of having Image.toBlob() and video.frameToBlob() made available.
>
>
>> - conveniently store in webstorage/other permanent storage (possibly
>> also for caching purposes?)
>
> You can store blobs into IndexDB directly.
>
>
>> - downloading an image to disk (depending on other features like
>> anchor's download attribute)
>
> Browsers offer this feature already.
>
>
>> These are especially useful with javascript-synthesised images. I
>> suppose it would have to be disallowed for cross-domain images, else
>> canvas' dirty flag can be worked around by deep copying a cross-domain
>> image.
>
> If it's a JS-synthesised image, just synthesise it straight to canvas and
> use that instead.
>
>
>> It seems to make sense to also consider it for video, but it may be
>> difficult to deal with streaming or strings storing very large amounts
>> of data. How about a snapshot() method that returns a new Image() with
>> the contents of the currently displaying frame? This can also be worked
>> around by drawImage() to a temporary canvas, so exists just as a
>> convenience method as well.
>
> I think if we want to support doing things to frames of videos, we should
> approach the problem in much the same way as we do for audio, with a
> dedicated off-the-main-thread processing pipeline.
>
>
>> Use cases:
>> - easily get a representative frame, e.g. for a thumbnail
>> - easily snapshot the current frame when displaying webcam feed with
>> getUserMedia(). e.g. var myPhoto = video.snapshot();, or some of the above
>> uses with video.snapshot().toDataURL().
>
> On Tue, 29 May 2012, Glenn Maynard wrote:
>>
>> It doesn't need any overhead, actually. You can create a single canvas
>> for all of your readback operations. As long as you keep the canvas out
>> of the document, it doesn't even need to actually blit the image; a
>> smart implementation can delay that, so when you read the data back it
>> can get the pixel data directly from the original image. This is more
>> important with toBlob, where implementations might be able to skip the
>> compression step and just return the original compressed data.
>>
>> (These are use cases for reading back images--they're not really use
>> cases for adding another way to do it.)
>
> Indeed. It's not clear that adding this new feature has a compelling need.
>
> --
> Ian Hickson U+1047E )\._.,--....,'``. fL
> http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,.
> Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
More information about the whatwg
mailing list