js 上传图片、压缩、旋转

html

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>js上传图片</title>
    <script src="Script/plugins/0com/exif.js"></script>
</head>
<body>
    <input id="file" type="file">

    <script type="text/javascript">
        var fileTypes = [‘image/jpeg‘, ‘image/gif‘, ‘image/png‘];
        window.onload = function myfunction() {
            var input = document.getElementById(‘file‘);
            input.onchange = function () {
                var files = this.files;
                for (var i = 0, len = files.length; i < len; i++) {
                    var file = files[i];
                    if (!fileTypes.includes(file.type)) {
                        alert("只可上传图片")
                        return false;
                    }
                    if (file.size / 1024 > 1025) {
                        photoCompress(file, { quality: 0.3 }, upload_html5);
                    }
                    else {
                        upload_html5(file);
                    }
                }
            };
        }

        function upload_html5(file) {
            var xhr = new XMLHttpRequest();
            xhr.upload.addEventListener("progress", function (e) { }, false);
            xhr.addEventListener("load", function (e) {
                var obj = JSON.parse(e.target.responseText);
                if (obj.code == 200) {
                    alert("上传成功");
                }
                else {
                    alert(obj.message);
                }
            }, false);
            xhr.addEventListener("error", function (e) {
                console.log(e);
                alert("上传失败");
            }, false);
            xhr.addEventListener("abort", function (e) {
                alert("上传取消");
            }, false);

            var fd = new FormData;
            fd.append("file", file);
            fd.append("hallName", ‘分会场1‘);
            fd.append("dateTime", ‘2019-06-21‘);
            xhr.open("post", "/Common/UploadFile");
            xhr.send(fd);
        }

        /*
        三个参数
        file:一个是文件(类型是图片格式),
        w:一个是文件压缩的后宽度,宽度越小,字节越小
        objDiv:一个是容器或者回调函数
        photoCompress()
         */
        function photoCompress(file, obj, objDiv) {
            var Orientation = null;//ios选择上传图片是图片角度问题
            EXIF.getData(file, function () {
                EXIF.getAllTags(this);
                Orientation = EXIF.getTag(this, ‘Orientation‘);
            });
            var ready = new FileReader();
            /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,
             * 如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
            ready.readAsDataURL(file);
            ready.onload = function () {
                canvasDataURL(this.result, obj, Orientation, objDiv)
            }
        }
        function canvasDataURL(path, obj, Orientation, callback) {
            var img = new Image();
            img.src = path;
            img.onload = function () {
                var that = this;
                // 默认按比例压缩
                var w = that.width,
                    h = that.height,
                    scale = w / h;
                w = obj.width || w;
                h = obj.height || (w / scale);
                var quality = 0.7;  // 默认图片质量为0.7
                //生成canvas
                var canvas = document.createElement(‘canvas‘);
                var ctx = canvas.getContext(‘2d‘);
                // 创建属性节点
                var anw = document.createAttribute("width");
                anw.nodeValue = w;
                var anh = document.createAttribute("height");
                anh.nodeValue = h;
                canvas.setAttributeNode(anw);
                canvas.setAttributeNode(anh);

                if (Orientation != "" && Orientation != 1 && Orientation != undefined) {
                    switch (Orientation) {
                        case 6://需要顺时针90度旋转
                            canvas.width = h;
                            canvas.height = w;
                            ctx.rotate(90 * Math.PI / 180);
                            ctx.drawImage(this, 0, -h);
                            break;
                        case 8://需要逆时针90度旋转
                            canvas.width = h;
                            canvas.height = w;
                            ctx.rotate(-90 * Math.PI / 180);
                            ctx.drawImage(this, -w, 0);
                            break;
                        case 3://需要180度旋转
                            ctx.rotate(180 * Math.PI / 180);
                            ctx.drawImage(this, -w, -h);
                            break;
                    }
                }
                else {
                    ctx.drawImage(that, 0, 0, w, h);
                }
                // 图像质量
                if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
                    quality = obj.quality;
                }
                // quality值越小,所绘制出的图像越模糊
                var base64 = canvas.toDataURL(‘image/jpeg‘, quality);
                // 回调函数返回base64的值
                callback(base64);
            }
        }
        /**
         * 将以base64的图片url数据转换为Blob
         * @param urlData
         *            用url方式表示的base64图片数据
         */
        function convertBase64UrlToBlob(urlData) {
            var arr = urlData.split(‘,‘), mime = arr[0].match(/:(.*?);/)[1],
                bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
            while (n--) {
                u8arr[n] = bstr.charCodeAt(n);
            }
            return new Blob([u8arr], { type: mime });
        }

    </script>
</body>
</html>

原文地址:https://www.cnblogs.com/kikyoqiang/p/11074975.html

时间: 2024-11-05 14:21:47

js 上传图片、压缩、旋转的相关文章

js css 压缩

合并和压缩JS.CSS文件 压缩JS,CSS文件需要引用如下组件: gulp-minify-css: 压缩css gulp-jshint: 检查js gulp-uglify: 压缩js gulp-concat: 合并文件 gulp-rename: 重命名文件 gulp-clean: 清空文件夹 gulp-notify:提示 安装组件项目目录,通过cd 进入项目的根目录,执行下边的npm安装组件 npm install gulp-minify-css gulp-jshint gulp-uglify

gulpfile.js 合并压缩 requirejs 的配置文件

var gulp = require("gulp"); // var babel = require("gulp-babel"); // 用于ES6转化ES5 var uglify = require('gulp-uglify'); // 用于压缩 JS var minifycss = require('gulp-minify-css'); var amdOptimize = require("amd-optimize"); var concat

JS跟随鼠标旋转的图片

<html> <head> <title>JS跟随鼠标旋转的图片丨Daniel wellington</title> <script> <!-- Beginning of JavaScript - var x,y var step=5 var flag=1 var pause var timersmall var timerbig var isbigcircle=1 var pause=50 var bigradius var smallr

js的压缩与混淆

使用yuicompressor对js的压缩: tar xf jdk-7u45-linux-i586.gz chmod 775  jdk1.7.0_45 mv jdk1.7.0_45 /usr/local/java ln -s /usr/local/java/bin/java /usr/bin/ mv yuicompressor-2.4.8.jar /opt/ java -jar yuicompressor-x.y.z.jar --preserve-semi -o output.js input.

require.js+backbone 使用r.js 来压缩,本地不压缩,生产环境压缩 的实现方式

requie.js 和backbone.js 这里就不说了,可以去看官方文档,都很详细! 但是使用require.js 默认带的压缩方式感觉不是很方便,所以本文主要讲 利用r.js压缩,来实现本地不压缩,生产环境压缩 r.js 是运行在node上的,默认使用UglifyJS.UglifyJS真的很好用,那为什么说默认的方式 不是很方便呢? r.js 单独压缩一个文件也很好用的,但在实际项目中,总不能一个一个压吧!因此r.js提供了一种多文件的压缩方式 ,使用一个叫bulid.js 的配置文件来配

也谈谈js的压缩,jquery压缩。【转】

问题缘由: 负责公司的开发平台研发工作,考虑的知识产权的保护工作,必须要考虑java的加密技术和js脚本的加密技术.在目前java加密很容易破解的情况下,还是先搞定js的加密和压缩,一方面可以提高页面加载性能,另外一方面也希望辛苦研发出来的成果得到一定的保护. 研究过程: 1. 先强烈鄙视一下哪些随便转载文章的家伙,给我制造了很大的麻烦!!网上很多帖子都不靠谱.. 2. 首先想了解jquery使用什么压缩的, 网上找了半天,说法不一样,后来还是在jquery官网的最频繁问题中找到了答案,但这已经

关于ajaxfileupload.js上传图片使用历程(struts2)

因为要使用上传图片功能,附加图片的描述信息, 而传统的<s: file/>由于一些限制在这个小模块中无法使用, 于是搜到了使用ajaxfileupload.js插件进行上传的方法,在使用过程中,jsp,js,struts2 因为自己不熟悉ajax的情况出了许多的小问题,在这里记录一下, 方便自己查看,也希望能帮到他人, 首先说一下思路,通过点击上传直接触发js 的function 调用后台把图片拷贝到指定服务器目录,返回保存的路径到前台,然后跟随图片描述信息一起用ajax异步传到后台.(PS:

iis 发布asp.net mvc 网站时候js css 压缩问题,图片不加载问题

一.JS CSS 自动压缩问题 默认情况下mvc这个框架会把css,js文件压缩成一个js或者css文件,一会发现只有一个<link href="/Content/css?v=ji3nO1pdg6VLv3CVUWntxgZNf1zRciWDbm4YfW-y0RI1" rel="stylesheet"/>  和一个<script src="/bundles/modernizr?v=qVODBytEBVVePTNtSFXgRX0NCEjh9U

JS,html压缩及混淆工具

现在已经出现了不少有自己特色的: JSMin Javascript compressor Packer Closure Compiler YUI Compressor Pretty Diff JavaScript Optimizer pack:tag Minify Lightweight CssMin jsmin-php MiniME ShrinkSafe Granule JAWR CombineAndMinify CrunchMe 有些太简单的.基于某主流思路仿写(但又未能超越原作的更新版本)