博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二进制图片blob数据转canvas
阅读量:4974 次
发布时间:2019-06-12

本文共 2356 字,大约阅读时间需要 7 分钟。

javascript是有操作二进制文件的方法的,在这里就不详述了。

而AJAX的核心XMLHttpRequest也可以获取服务端给的二进制Blob。

可以参考:

 

代码还是基于上一篇文章的demo。二进制就用canvas转的blob数据模拟一下。

思路很简单,blob转image,image再转canvas。(image是base64的)

$("#getCroppedCanvas").on("click", function () {        console.log($('#image').cropper('getCroppedCanvas'));;        var cas=$('#image').cropper('getCroppedCanvas');        var base64url=cas.toDataURL('image/jpeg');        // new        cas.toBlob(function (e) {            console.log(e);  //生成Blob的图片格式            const reader = new FileReader()            reader.readAsDataURL(e)            reader.onload = function(e){                console.log("reader")                console.log(e.target.result)                let img = new Image()                img.src = e.target.result                img.id = "abc"                img.style.display = "none"                document.body.appendChild(img)                img.onload = function () {                    console.log("img")                    // console.log(this)                    console.log(this.width)                    console.log(this.height)                    console.log(this.naturalWidth)                    console.log(this.naturalHeight)                    let canvas = document.createElement("canvas")                    canvas.width = this.width                    canvas.height = this.height                    let ctx = canvas.getContext("2d")                    ctx.drawImage(this, 0, 0)                    document.body.removeChild(img)                    document.body.appendChild(canvas)                }            }        })            })

注意//new注释下面的部分。

这段代码有三层回调:canvas.toBlob()、new FileReader().onload()、image.onload()。

image回调的目的是获取图片正确的宽高,赋值给canvas。canvas有默认宽高,放着不管的话会拉伸图片。

值得注意的是:CanvasRenderingContext2D.drawImage()方法的第一个参数是不支持base64图片流的,这一点MDN的文档说明了。

image 绘制到上下文的元素。

允许任何的 canvas 图像源(CanvasImageSource),例如:CSSImageValue,HTMLImageElement,SVGImageElement,HTMLVideoElement,HTMLCanvasElement,ImageBitmap 或者OffscreenCanvas。

——CanvasRenderingContext2D.drawImage() - MDN

参考:

最后, CanvasRenderingContext2D.drawImage()方法 其实隐藏着一个大坑:使用不同的参数,参数的顺序是不一样的。

void ctx.drawImage(image, dx, dy);void ctx.drawImage(image, dx, dy, dWidth, dHeight);void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

我曾经被这个方法折腾的百思不得其解,看了MDN注意到这个坑爹的细节。

 

以上。

转载于:https://www.cnblogs.com/foxcharon/p/10241443.html

你可能感兴趣的文章
IOS 第三方管理库管理 CocoaPods
查看>>
背景色渐变(兼容各浏览器)
查看>>
Redis中7种集合类型应用场景
查看>>
MariaDB 和 MySQL 比较
查看>>
MYSQL: 1292 - Truncated incorrect DOUBLE value: '184B3C0A-C411-47F7-BE45-CE7C0818F420'
查看>>
Java JPA @Transient 在Hibernate中应用
查看>>
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
查看>>
springMVC Controller 参数映射
查看>>
JDK1.8源码分析02之阅读源码顺序
查看>>
java使用jsp servlet来防止csrf 攻击的实现方法
查看>>
缓存穿透/击穿/雪崩/降级
查看>>
我的作品
查看>>
【bzoj题解】2186 莎拉公主的困惑
查看>>
Protocol Buffer学习笔记
查看>>
Update 语句
查看>>
HBuilder打包Android apk 支付不了问题解决
查看>>
poj2594——最小路径覆盖
查看>>
程序员口述:我是如何工作三年后跳槽到美团的?
查看>>
欧拉函数
查看>>
关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案...
查看>>