在 img 上设置二进制数据
Setting binary data on img
假设我有一个<img/>
。这个 img 有 src='http://somelocation/getmypic'
.稍后,我可能希望根据接收二进制数据的 ajax 调用更改 img 的内容。我只有在收到 ajax 回调中的数据后才知道是否要将其应用于图像。我可能会决定不这样做。
据我所做的研究所知,在 img 上设置二进制数据的唯一方法是对二进制数据进行 base64 编码并将 img src 设置为生成的 base 64 编码字符串。
我的第一个也是主要问题是:开销是多少?这是否意味着我已经将图像下载的处理和内存使用量增加了三倍?我的 ajax 回调获取已加载到内存中的二进制数据,然后我对二进制流进行 base 64 编码,然后(我假设)浏览器将此流解码回二进制?还是我错过了什么,实际上并没有那么糟糕?
我的第二个问题是:为什么没有base64编码就无法将二进制数据直接设置到img中?我使用的大多数UI语言都允许您将图像从文件加载到"图片框"(例如)中,也可以在"图片框"中绘制。为什么 img 不允许这样做?我正在考虑 img.binary=bytes 它将 src 设置为"二进制"或类似的东西。此功能似乎分为 img 和 canvas,但有时您想同时执行这两项操作。我只是想知道我是否在我的理解中遗漏了一些东西(例如,不允许直接在 img 上设置二进制数据有一些设计或实现的好处)。
谢谢。
嗯,这就是我想出的。我不确定性能或内存使用情况是多少,但它比 base64 编码容易得多,并且可以与 asp.net MVC FileStreamResult 一起使用。所以,我想我会把它贴在这里,以防它帮助其他人:
var oReq = new XMLHttpRequest();
oReq.open("post", '/somelocation/getmypic', true );
oReq.responseType = "blob";
oReq.onload = function ( oEvent )
{
var blob = oReq.response;
var imgSrc = URL.createObjectURL( blob );
var $img = $( '<img/>', {
"alt": "test image",
"src": imgSrc
} ).appendTo( $( '#bb_theImageContainer' ) );
window.URL.revokeObjectURL( imgSrc );
};
oReq.send( null );
基本思想是数据不会被篡改,并以 blob 的形式接收。为该 blob 构造了一个 url(我认为这本质上意味着您可以使用 URL 访问内存中的该 blob)。但好消息是您可以将 img src 设置为这个,这是......棒。
这个答案让我走上了正确的轨道,然后是这个页面和mdn上的这个页面。 请注意支持的浏览器。
- 如何处理从条形码扫描仪返回的二进制数据
- 将图像文件存储在猫鼬模式中的二进制数据中,并以html形式显示图像
- 二进制数据的可移植hashCode实现
- Javascript-将类型化数组保存为blob,并作为二进制数据读回
- 获取二进制数据并将其保存为.mp3文件Javascript
- 二进制数据的createObjectUrl失败
- 将数据结构转换为二进制数据
- 将二进制数据发送到服务器
- 将通过 AJAX 上传的二进制数据保存在 PHP 服务器上
- 如何在IE9中读取二进制数据
- 如何将二进制数据映射到javascript中的字符
- Base64解码不适用于二进制数据
- 如何在Firefox中使用xmlhttprequest和二进制数据,例如图像
- 通过HTTP请求将二进制数据上传到AppEngineBlobstore
- 为什么在Web套接字中使用二进制数据
- 在将图像作为原始图像二进制数据(png或jpeg)上传到服务器之前,裁剪或调整图像大小
- 如何在不编码或保存数据的情况下将二进制数据从javascript传递到actionscript(网页到flash)
- 使用牛仔和MessagePack通过websocket发送二进制数据
- 如何在严格模式下将附件下载为二进制数据
- 如何在浏览器中显示单词/ pdf二进制数据