DataURL与File,Blob,canvas对象之间的互相转换的Javascript

canvas转换为dataURL (从canvas获取dataURL)

<code class="hljs cs has-numbering"><span class="hljs-keyword">var</span> dataurl = canvas.toDataURL(<span class="hljs-string">'image/png'</span>);
<span class="hljs-keyword">var</span> dataurl2 = canvas.toDataURL(<span class="hljs-string">'image/jpeg'</span>, <span class="hljs-number">0.8</span>);</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul>

File对象转换为dataURL、Blob对象转换为dataURL

File对象也是一个Blob对象,二者的处理相同。

<code class="hljs javascript has-numbering"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">readBlobAsDataURL</span><span class="hljs-params">(blob, callback)</span> {</span>
    <span class="hljs-keyword">var</span> a = <span class="hljs-keyword">new</span> FileReader();
    a.onload = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(e)</span> {</span>callback(e.target.result);};
    a.readAsDataURL(blob);
}
<span class="hljs-comment">//example:</span>
readBlobAsDataURL(blob, <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(dataurl)</span>{</span>
    console.log(dataurl);
});
readBlobAsDataURL(file, <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(dataurl)</span>{</span>
    console.log(dataurl);
});</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>

dataURL转换为Blob对象

<code class="hljs javascript has-numbering"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">dataURLtoBlob</span><span class="hljs-params">(dataurl)</span> {</span>
    <span class="hljs-keyword">var</span> arr = dataurl.split(<span class="hljs-string">','</span>), mime = arr[<span class="hljs-number">0</span>].match(<span class="hljs-regexp">/:(.*?);/</span>)[<span class="hljs-number">1</span>],
        bstr = atob(arr[<span class="hljs-number">1</span>]), n = bstr.length, u8arr = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint8Array</span>(n);
    <span class="hljs-keyword">while</span>(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Blob([u8arr], {type:mime});
}
<span class="hljs-comment">//test:</span>
<span class="hljs-keyword">var</span> blob = dataURLtoBlob(<span class="hljs-string">'data:text/plain;base64,YWFhYWFhYQ=='</span>);
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>

dataURL图片数据绘制到canvas

先构造Image对象,src为dataURL,图片onload之后绘制到canvas

<code class="hljs javascript has-numbering"><span class="hljs-keyword">var</span> img = <span class="hljs-keyword">new</span> Image();
img.onload = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span>{</span>
    canvas.drawImage(img);
};
img.src = dataurl;</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

File,Blob的图片文件数据绘制到canvas

还是先转换成一个url,然后构造Image对象,src为dataURL,图片onload之后绘制到canvas

利用上面的 readBlobAsDataURL 函数,由File,Blob对象得到dataURL格式的url,再参考 dataURL图片数据绘制到canvas

<code class="hljs javascript has-numbering">readBlobAsDataURL(file, <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(dataurl)</span>{</span>
    <span class="hljs-keyword">var</span> img = <span class="hljs-keyword">new</span> Image();
    img.onload = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span>{</span>
        canvas.drawImage(img);
    };
    img.src = dataurl;
});</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>

不同的方法用于构造不同类型的url (分别是 dataURL, objectURL(blobURL), filesystemURL)。这里不一一介绍,仅以dataURL为例。

filesystemURL不是指本地文件URL的形式(file:///….), 而是格式类似于 filesystem:http://... 的一种URL,支持沙盒文件系统的浏览器支持(目前仅Chrome)支持。

Canvas转换为Blob对象并使用Ajax发送

转换为Blob对象后,可以使用Ajax上传图像文件。

先从canvas获取dataurl, 再将dataurl转换为Blob对象

<code class="hljs go has-numbering"><span class="hljs-keyword">var</span> dataurl = canvas.toDataURL(<span class="hljs-string">'image/png'</span>);
<span class="hljs-keyword">var</span> blob = dataURLtoBlob(dataurl);
<span class="hljs-comment">//使用ajax发送</span>
<span class="hljs-keyword">var</span> fd = <span class="hljs-built_in">new</span> FormData();
fd.<span class="hljs-built_in">append</span>(<span class="hljs-string">"image"</span>, blob, <span class="hljs-string">"image.png"</span>);
<span class="hljs-keyword">var</span> xhr = <span class="hljs-built_in">new</span> XMLHttpRequest();
xhr.open(<span class="hljs-string">'POST'</span>, <span class="hljs-string">'/server'</span>, <span class="hljs-constant">true</span>);
xhr.send(fd);</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>

转载请保留来源 http://blog.csdn.net/cuixiping/article/details/45932793

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值