com.js

  1. export const compressImage=function (files,fn,preCallbackFn,i) {
  2. let newfile = files.files[0];
  3. let quality = 0.1;
  4. const name = newfile.name; //文件名
  5. let reader = new FileReader();
  6. reader.readAsDataURL(newfile);
  7. reader.onload = (e) => {
  8. const src = e.target.result;
  9. const img = new Image();
  10. img.src = src;
  11. img.onload = (e) => {
  12. const w = img.width;
  13. const h = img.height;
  14. //生成canvas
  15. const canvas = document.createElement('canvas');
  16. const ctx = canvas.getContext('2d');
  17. // 创建属性节点
  18. const anw = document.createAttribute("width");
  19. anw.nodeValue = w;
  20. const anh = document.createAttribute("height");
  21. anh.nodeValue = h;
  22. canvas.setAttributeNode(anw);
  23. canvas.setAttributeNode(anh);
  24.  
  25. //铺底色 PNG转JPEG时透明区域会变黑色
  26. ctx.fillStyle = "#fff";
  27. ctx.fillRect(0, 0, w, h);
  28.  
  29. ctx.drawImage(img, 0, 0, w, h);
  30. // quality值越小,所绘制出的图像越模糊
  31. const base64 = canvas.toDataURL('image/jpeg', quality); //图片格式jpeg或webp可以选0-1质量区间
  32.  
  33. console.log(`原图${(src.length / 1024).toFixed(2)}kb`, `新图${(base64.length / 1024).toFixed(2)}kb`);
  34. if(base64.length>1024*1024*1){
  35. return false;
  36. }
  37.  
  38. let arr = base64.split(','), mime = arr[0].match(/:(.*?);/)[1],
  39. bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  40. while(n--){
  41. u8arr[n] = bstr.charCodeAt(n);
  42. }
  43. let obj = new Blob([u8arr], {type:'image/jpeg'});
  44. preCallbackFn && preCallbackFn(base64,obj,i);
  45. fn && fn(obj);
  46. }
  47. }
  48. };
  49.  
  50. //上传图片校验
  51. export const checkImg=function(file){
  52. var aa=file.value.toLowerCase().split('.');
  53. if(!(aa[aa.length-1]=='gif'||aa[aa.length-1]=='jpg'||aa[aa.length-1]=='jpeg'||aa[aa.length-1]=='png')){
  54. throw {code:400,msg:"请选择格式为*.jpg、*.gif、*.jpeg、*.png的图片"};
  55. }
  56. var imagSize = file.files[0].size;
  57. if(imagSize>1024*1024*1){
  58. throw {code:401,msg:"图片过大,无法上传"};
  59. }
  60. return true;
  61. };
  1.  
  1. import {checkImg,compressImage} from "com";
  1.  
  1. imgPreview(){
  2. let file=document.getElementById("imgInput");
  3. try {
  4. checkImg(file)
  5. }catch(e) {
  6. if(e.code==401){
  7. if(compressImage(file,this.upImg,this.preCallbackFn) === false){
  8. return alert(e.msg);
  9. }
  10. return true;
  11. }else {
  12. return alert(e.msg);
  13. }
  14. }
  15. if (file.files && file.files[0]) {
  16. let reader = new FileReader();
  17. reader.onload = function (evt) {
  18. let img = document.querySelector('#img_preview img');
  19. img.setAttribute('src', evt.target.result);
  20. }
  21. reader.readAsDataURL(file.files[0]);
  22. this.upImg(file.files[0]);
  23. }
  24. },
  1. upImg(file){
    let formData = new FormData();
    formData.append("img", file,"image.jpeg");
  2.  
  3.     //fileUpload 上传为接口
  4.  
  5. fileUpload(formData).then(data=>{
  1. if(!data) return false;
    userModifyImg(data).then(data=>{
    if(!data) return false;
    alert("上传图片成功!")
    });
    });
    },
  1.  

js 压缩 预览 上传图片的更多相关文章

  1. 用js实现预览待上传的本地图片

    js实现预览待上传的本地图片,代码如下: <form name="form5" id="form5" method="post" ac ...

  2. js预览上传图片

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. html5 ajax多图片可预览上传图片

    最近不是特别忙,我就利用html5写了个上传图片(或其他文件)的页面,主要利用是html5的file api,此页面比较简陋,没做样式的优化,包含上传图片预览,多图片上传,上传进度条(利用html5的 ...

  4. 移动端Vue图片获取,压缩,预览组件-upload-img(H5+获取照片,压缩,预览)

    组件示例图 组件代码 upload_img.vue <div id="uploadImg"> <div class="upload_image_box& ...

  5. js图片预览插件,不涉及上传

    小小的几十行代码,很牛逼,很实用. 支持多个图片的预览,只要new多个对象就行了. html如下 <!-- zhouxiang www.zhou-xiang.com --> <!DO ...

  6. fis3+vue+pdf.js制作预览PDF文件或其他

    人生第一篇博客,的确有点紧张,但有些许兴奋,因为这对于我来说应该是一个好的开始,以此励志在技术的道路上越走越远. 看过了多多少少的技术博客,给自己带来了很多技术上的收获,也因此在想什么时候自己也可以赠 ...

  7. C# asp:FileUpload上传文件使用JS实现预览效果

    js代码: <script type="text/javascript"> //下面用于图片上传预览功能 function setImagePreview() { va ...

  8. previewImage.js图片预览缩放保存插件

    previewImage.js好用的图片预览缩放保存插件

  9. pc或者微信上用pdf.js在线预览pdf和word

    最近项目要求pdf和word可以在线预览功能,pc端还好解决,但是微信端就有点坑了,pc端原来的思路是将文件转成base64,然后用html格式显示 ,但是微信端不支持, 这种方式就pass掉了,谷歌 ...

随机推荐

  1. AtCoder square869120 Contest #3 F sushi

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. Java中如何实现类似C++结构体的二级排序

    1:实现Comparable接口 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; ...

  3. 用java代码将数组元素顺序颠倒

    package test; public class Recover { public int[] reverse(int[] a) { int[] b = new int[a.length]; in ...

  4. Oracle 12c Windows安装、介绍及简单使用(图文)

    1.下载 地址为:http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html 含企业版和 ...

  5. 字符集(编码)转换_Qt532_QString

    1.网上的资料: 1.1.参考网址:http://blog.csdn.net/changsheng230/article/details/6588447 1.2.网页内容: “ Qt 使用Unicod ...

  6. iOS Socket编程-C语言版(TCP)

    . TCP Socket编程 TCP是面向连接的,安全可靠的传输层协议.TCP的程序基本框架设计图: TCP的程序基本框架设计图.jpg 注意:Socket通信一定有要服务端和客户端. 1.1 TCP ...

  7. ASCII 和 Unicode 编码的由来

    大话数据结构上的说明: 网络博文的说明:

  8. CAS操作原理分析

      一.CAS简单介绍     CAS:Compare and Swap, 翻译成比较并交换.     java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁 ...

  9. hdu 2018多校8

    A.Character Encoding 简单计数 m个非负数和等于k的方案数为$\binom{m+k-1}{k}$, 但题目还要求每个数小于n, 容斥一下即可 即$ans = \sum\limits ...

  10. csp公共钥匙盒

    1.公共钥匙盒 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥 ...