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