html5的canvas十分之强大,可以做到快速的截取压缩出新的图片!

不过最近开发过程中遇到一个问题,图片压缩后使用toDataURL取得图片显示为一片漆黑,什么都没有!

折腾了很久,起初以为是上传问题,base64可能太长被截断了,后来有考虑是不是手机webview不支持canvas,总之最后百度了,发现webkit加载图片是异步的。。。终于恍然大悟,上js回调大法

//图片压缩函数,i为图片(base64格式或图片路径均可),w为压缩宽度,h为压缩高,img读取时异步的,返回处理base64图片的回调
owner.zipBaseImg = function(i, w, h, callback) {
w = w || 100;
h = h || 100; var img = document.createElement("img"); //创建临时图片
img.src = i; var canvas = document.createElement("canvas"); //创建临时画布
canvas.width = w;
canvas.height = h; var ctx = canvas.getContext("2d");
img.onload = function() { //监听到图片加载结束,再压缩图片!
ctx.drawImage(img, 0, 0, w, h); //传入临时图片
if(callback && typeof callback == "function")
return callback(canvas.toDataURL("image/jpeg", 1)); //第二个参数是质量
};
}

以上是使用canvas截取或者压缩图片的方法,基本思路是:

  1. 传入一个图片地址或者是base64图片。
  2. 分别新建一个canvas和img的dom对象
  3. 固定canvas元素的长宽(重要!必须!否则截图为空)
  4. 获得上下文getContext使用2d截图
  5. 接下来需要一个异步回调,等待img onload结束
  6. drawImage(绘制新图)和toDataURL(返回base64)放在onload中

关于drawImage压缩和截图:

http://www.w3school.com.cn/tags/canvas_drawimage.asp

总结:图片加载使用异步,使用onload等待其加载完后再进行drawImage,否则图片都没有加载出来,怎么绘制新图?!

Canvas DrawImage截取和压缩图片的陷阱的更多相关文章

  1. <canvas>drawImage()方法无法显示图片

    在书上看到用<canvas>绘制图像就动手试试,刚开始,我的代码是这样的: <!DOCTYPE html> <html> <head> <meta ...

  2. canvas drawImage方法不显示图片的解决方案

    先复习一下用法: context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height); 各个参数说明: 参数 描述 img 规定要使用的图像.画布 ...

  3. 利用canvas压缩图片

    现在手机拍的照片动不动就是几M,当用户上传手机里的照片时一个消耗流量大,一个上传时间长,为了解决这个问题,就需要压缩图片: 想法:利用canvas重绘图片,保持宽高比不变,具体宽高根本具体情况而定. ...

  4. 基于html5 canvas 的客户端异步上传图片的插件,支持客户端压缩图片尺寸

    /** * Created by xx on 15-05-28. * 基于html5 canvas 的客户端异步上传画片的插件 * 在实际应用中,常常要用于上传图片的功能.在现在越来越多的手机weba ...

  5. canvas压缩图片

    1.canvas.toDataUrl压缩图片 canvas的toDataUrl方法可以将内容导出为base64编码格式的图片,采用base64编码将比源文件大1/3,但是该方法可以指定导出图片质量,所 ...

  6. 使用canvas压缩图片 并上传

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 上传图片时压缩图片 - 前端(canvas)做法

    HTML前端代码: <?php $this->layout('head'); ?> <?php $this->layout('sidebar'); ?> <m ...

  8. js使用canvas在前端压缩图片

    HTML代码: <input id="file" type="file"> JS代码: var eleFile = document.querySe ...

  9. JS压缩图片(canvas),返回base64码

    上传图片时总会遇到图片过大上传不上去的问题,本方法是在网上搜的压缩图片的例子,我测试过了,确实能用,但是照搬别人的代码,发现压缩后图片会失真,不清晰,现经修改图片清晰度还可以,不仔细看差别不大,so, ...

随机推荐

  1. VS2017 调试期间无法获取到变量值查看

    只要把勾去掉就能查看变量的值了

  2. Python并发实践_02_通过yield实现协程

    python中实现并发的方式有很多种,通过多进程并发可以真正利用多核资源,而多线程并发则实现了进程内资源的共享,然而Python中由于GIL的存在,多线程是没有办法真正实现多核资源的. 对于计算密集型 ...

  3. eclipse启动tomcat不能访问解决

    tomcat在eclipse里面能正常启动,而在浏览器中访问http://localhost:8080/不能访问,且报404错误.同时其他项目页面也不能访问. 关闭eclipse里面的tomcat,在 ...

  4. Python2和Python3中的字符串编码问题解决

    Python2和Python3在字符串编码上是有明显的区别. 在Python2中,字符串无法完全地支持国际字符集和Unicode编码.为了解决这种限制,Python2对Unicode数据使用了单独的字 ...

  5. [Spark内核] 第28课:Spark天堂之门解密

    本課主題 什么是 Spark 的天堂之门 Spark 天堂之门到底在那里 Spark 天堂之门源码鉴赏 引言 我说的 Spark 天堂之门就是SparkContext,这篇文章会从 SparkCont ...

  6. 常见的Linux 的命令

    rm命令 -f :就是force的意思,忽略不存在的文件,不会出现警告消息 -i :互动模式,在删除前会询问用户是否操作 -r :递归删除,最常用于目录删除,它是一个非常危险的参数 如: rm -i ...

  7. C#学习笔记-建造者模式

    题目:用程序画一个小人. 实现: public partial class Form1 : Form { public Form1() { InitializeComponent(); } priva ...

  8. python高精度浮点型计算的诡异错误

    >>> from decimal import Decimal >>> a=Decimal(100.1) >>> b=Decimal(100.1) ...

  9. JSP执行过程分析

    概述 在java领域,表现层技术主要有三种:jsp.freemarker.velocity.jsp是由sun公司倡导的官方标准,freemarker和velocity是第三方的模板. jsp是大家最熟 ...

  10. python解析域名

    #coding:utf-8 import socket def URL2IP(): for oneurl in urllist.readlines(): url=str(oneurl.strip()) ...