im发送图片,现将图片压缩再上传

1) 调用 FileReader 的 reader.readAsDataURL(img); 方法, 在其onload事件中, 将用户选择的图片读入 Image对象.

2) 在image对象的 onload 事件中, 通过 canvas 的 canvas.getContext('2d') 的 drawImage 方法, 将Image 改变大小绘制到canvas上.

3) 通过 canvas.toDataURL("image/jpeg", 1); 方法, 将图片变成base64字符串, 放到send_image_value

toDataURL

  1. canvas.toDataURL(type, encoderOptions); 

返回值

  包含 data URI 的DOMString

type

  图片格式,默认为 image/png

encoderOptions

  在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。

html

  1. <input id="sendImage" title="send a picture" type="file" accept="image/*" onchange="imgChange(this)">
  2.  
  3. <input type="hidden" value="" id="send_image_value">
  4.  
  5. <img id="showLoadingimg" src="'+CHAT_SITE_URL+'/templates/default/images/loading.gif" style="position:relative;left:200px;top:200px;z-index:999;display:none;">

  

js

  1. function imgChange(e){
  2. //检查是否有文件被选中
  3. if (e.files.length != 0) {
  4. var file = e.files[0],
  5. fileType = file.type,
  6. reader = new FileReader();
  7. if (!reader) {
  8. e.value = '';
  9. return;
  10. };
  11. var size = file.size;
  12. var max_size = 2*1024*1024;
  13. if(size>max_size){
  14. e.value = '';
  15. $("#send_alert").html('file is too large(>2M)');
  16. return;
  17. }
  18. $("#showLoadingimg").show();
  19. reader.onload = function(e) {
  20. //读取成功,显示到页面并发送到服务器
  21. e.value = '';
  22. var org_img = e.target.result;
  23. var image_base64 = org_img;
  24. if(size>1024*80){//>80K的
  25. var img = new Image();
  26. img.src = org_img;
  27. img.onload=function(){
  28. var scale = 1;
  29. if(this.width > 300 || this.height > 300){
  30. if(this.width > this.height){
  31. scale = 300 / this.width;
  32. }else{
  33. scale = 300 / this.height;
  34. }
  35. }
  36. var canvas = document.createElement("canvas"), drawer = canvas.getContext("2d");
  37. if(scale!=1) {//按最大高度等比缩放
  38. img.width *= scale;
  39. img.height *= scale;
  40. }
  41. canvas.width = img.width;
  42. canvas.height = img.width * (img.height / img.width);
  43. drawer.drawImage(img, 0, 0, canvas.width, canvas.height);
  44. var tmp_code = image_base64 = canvas.toDataURL(fileType);
  45. if(tmp_code!='data:,'){
  46. image_base64 = tmp_code;
  47. }
  48. img_send(image_base64);
  49. };
  50.  
  51. }else{
  52. img_send(image_base64);
  53. }
  54.  
  55. };
  56. reader.readAsDataURL(file);
  57. }
  58. }
  59. /**
  60. *为将图片赋值给消息
  61. **/
  62. function img_send(image_base64){
  63. if(image_base64!='data:,'){
  64. $("#send_image_value").val(image_base64);
  65. send_msg();
  66. $("#showLoadingimg").hide();
  67. $('#sendImage').val("");
  68. }
  69. }  

开始时,toDataURL获取的值是data:,

$("#send_image_value").val(image_base64);
send_msg();

这两句写在

reader.onload方法的最下面这就导致图片并没有压缩

因为img.onload还没执行完

发送的还是原来的图片

在调整后就可以实现图片的压缩了

js压缩上传图片base64长度的更多相关文章

  1. js压缩图片base64长度

    var myCanvas=$('.img-container > img').cropper('getCroppedCanvas'); (function (base64){ var image ...

  2. js压缩上传图片

    初学有不当之处,请多多指点, <body> <div class="cc"> <input type="file" id=&quo ...

  3. JS实现图片base64转blob对象,压缩图片,预览图片,图片旋转到正确角度

    base64转blob对象 /** 将base64转换为文件对象 * @param {String} base64 base64字符串 * */ var convertBase64ToBlob = f ...

  4. 图片上传前 压缩,base64图片压缩 Exif.js处理ios拍照倒置等问题

    曾写过在前端把图片按比例压缩不失真上传服务器的前端和后台,可惜没有及时做总结保留代码,只记得js利用了base64位压缩和Exif.js进行图片处理,还有其中让我头疼的ios拍照上传后会倒置等诸多问题 ...

  5. java 七牛上传图片到服务器(采用的html5 压缩 传输base64方式)

    //html 页面如下<div class="form-group"> <label class="col-sm-2 control-label&quo ...

  6. 图片纯前端JS压缩的实现

    一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅 ...

  7. HTML5 file API加canvas实现图片前端JS压缩并上传

    一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅 ...

  8. js压缩、混淆和加密

    最近看到有些论坛在讨论js压缩.混淆和加密的问题,特意找了些资料看了下,现在总结一下: 1.关于三者的定义与区别 压缩:删除 Javascript 代码中所有注释.跳格符号.换行符号及无用的空格,从而 ...

  9. 图片压缩(js压缩,底部有vue压缩图片依赖使用的教程链接)

    directTurnIntoBase64(fileObj, callback) { var r = new FileReader(); // 转成base64 r.onload = function( ...

随机推荐

  1. PHP数据库连接失败--could not find driver 解决办法

    数据库连接失败could not find driver在调试一个PHP程序时,报了这个错误, could not find driver 经过一番查找,结合自己的思考和实践,终于找到了问题所在. 原 ...

  2. (转) Hadoop1.2.1安装

    环境:ubuntu13 使用的用户为普通用户.如:用户ru jdk安装略 1.安装ssh (1) sudo apt-get install openssh-server (2)配置ssh面密码登录 $ ...

  3. winsock.h与winsock2.h出现重定义或不同的链接

    经常遇到编译socket程序的时候生成几百个错误 以下是出错后的错误信息: >c:\program files\microsoft sdks\windows\v6.0a\include\ws2d ...

  4. Linxu安装Tomcat与Jdk并卸载自带OpenJdk

    下载安装tomcat 1.下载apache-tomcat-7.0.47.tar.gz tomcat压缩包上传到linxu服务器 2.cd到文件存放目录使用(tar -xvzf apache-tomca ...

  5. mosquitto简单应用

    1. 简述 一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机 ...

  6. 递归 - 求 n 个球中取 m 个不同的球,有多少种取法?

    代码: #include <iostream> using namespace std; int F(int _n, int _m) { if(_n < _m) return 0; ...

  7. Error:不能将"char*"类型的值分配到"LPSTR"类型的实体 也许 "char*"类型的实参与"LPCWSTR"类型的形参不兼容

    http://www.myexception.cn/ruby-rails/1876106.html 选择“XXX项目”->“属性”->“配置属性”->“常规”选项中,把“使用 Uni ...

  8. Java学习路线图,Java学习计划建议

    怎么学习Java,这是很多新手经常遇到的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西:     首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA).J ...

  9. JS 控制页面超时后自动跳转到登陆页面

    <span style="font-size: small;"><script language="javascript"> var m ...

  10. Jquery ThickBox的使用

    thickbox是jQuery的一个插件,其作用是弹出对话框.网页框,使用户体验度更加愉悦,下面就来简单介绍它的几种用法.声明一下:这只是个人的总结记载而已.准备工作:你需要三个文件:thickbox ...