H5实现图片优化上传

一,HTML部分

<input type="file" accept="images/*">
<input class="url" type="url" placeholder="url">
<div class="container"></div>
<button class="submit">Submit</button>

二,CSS部分

.container{
    width: 300px;
}
.resizer{
    overflow: hidden;
}
.resizer.have-img button.ok{
    display: inline-block;
}
.resizer.have-img .inner {
    display: block;
}
.inner{
    width: 100%;
    position: relative;
    font-size: 0;
    overflow: hidden;
    display: none;
}
img{
    width: 100%;
}

.frames{
    position: absolute;
    top: 0;
    left: 0;
    border: 1px solid black;
    cursor: move;
    outline: rgba(0, 0, 0, 0.6) solid 10000px;
}
button.ok{
    float:right;
    margin-left: 5px;
    display: none;
}
canvas{
    max-width: 100%;
    margin:auto;
    display: block;
}

三,JS部分(重点)

var tmp=$(‘<div class="resizer">‘+
          ‘<div class="inner">‘+
          ‘<img>‘+
          ‘<div class="frames"></div>‘+
          ‘</div>‘+
          //‘<button>✗</button>‘+
          ‘<button class="ok">✓</button>‘+
          ‘</div>‘);
$.imageResizer=function(){
    if(Uint8Array&&HTMLCanvasElement&&atob&&Blob){

    }else{
        return false;
    }
    var resizer=tmp.clone();

    resizer.image=resizer.find(‘img‘)[0];
    resizer.frames=resizer.find(‘.frames‘);
    resizer.okButton=resizer.find(‘button.ok‘);
    resizer.frames.offset={
        top:0,
        left:0
    };

    resizer.okButton.click(function(){
        resizer.clipImage();
    });
    resizer.clipImage=function(){
        var nh=this.image.naturalHeight,
            nw=this.image.naturalWidth,
            size=nw>nh?nh:nw;

        size=size>1000?1000:size;

        var canvas=$(‘<canvas width="‘+size+‘" height="‘+size+‘"></canvas>‘)[0],
            ctx=canvas.getContext(‘2d‘),
            scale=nw/this.offset.width,
            x=this.frames.offset.left*scale,
            y=this.frames.offset.top*scale,
            w=this.frames.offset.size*scale,
            h=this.frames.offset.size*scale;

        ctx.drawImage(this.image,x,y,w,h,0,0,size,size);
        var src=canvas.toDataURL();
        this.canvas=canvas;
        this.append(canvas);
        this.addClass(‘uploading‘);
        this.removeClass(‘have-img‘);

        src=src.split(‘,‘)[1];
        if(!src)return this.doneCallback(null);
        src=window.atob(src);

        var ia = new Uint8Array(src.length);
        for (var i = 0; i < src.length; i++) {
            ia[i] = src.charCodeAt(i);
        };

        this.doneCallback(new Blob([ia], {type:"image/png"}));
    };

    resizer.resize=function(file,done){
        this.reset();
        this.doneCallback=done;
        this.setFrameSize(0);
        this.frames.css({
            top:0,
            left:0
        });
        var reader=new FileReader();
        reader.onload=function(){
            resizer.image.src=reader.result;
            reader=null;
            resizer.addClass(‘have-img‘);
            resizer.setFrames();
        };
        reader.readAsDataURL(file);
    };

    resizer.reset=function(){
        this.image.src=‘‘;
        this.removeClass(‘have-img‘);
        this.removeClass(‘uploading‘);
        this.find(‘canvas‘).detach();
    };

    resizer.setFrameSize=function(size){
        this.frames.offset.size=size;
        return this.frames.css({
            width:size+‘px‘,
            height:size+‘px‘
        });
    };

    resizer.getDefaultSize=function(){
        var width=this.find(".inner").width(),
            height=this.find(".inner").height();
        this.offset={
            width:width,
            height:height
        };
        console.log(this.offset)
        return width>height?height:width;
    };

    resizer.moveFrames=function(offset){
        var x=offset.x,
            y=offset.y,
            top=this.frames.offset.top,
            left=this.frames.offset.left,
            size=this.frames.offset.size,
            width=this.offset.width,
            height=this.offset.height;

        if(x+size+left>width){
            x=width-size;
        }else{
            x=x+left;
        };

        if(y+size+top>height){
            y=height-size;
        }else{
            y=y+top;
        };
        x=x<0?0:x;
        y=y<0?0:y;
        this.frames.css({
            top:y+‘px‘,
            left:x+‘px‘
        });

        this.frames.offset.top=y;
        this.frames.offset.left=x;
    };
    (function(){
        var time;
        function setFrames(){
            var size=resizer.getDefaultSize();
            resizer.setFrameSize(size);
        };

        window.onresize=function(){
            clearTimeout(time)
            time=setTimeout(function(){
                setFrames();
            },1000);
        };

        resizer.setFrames=setFrames;
    })();

    (function(){
        var lastPoint=null;
        function getOffset(event){
            event=event.originalEvent;
            var x,y;
            if(event.touches){
                var touch=event.touches[0];
                x=touch.clientX;
                y=touch.clientY;
            }else{
                x=event.clientX;
                y=event.clientY;
            }

            if(!lastPoint){
                lastPoint={
                    x:x,
                    y:y
                };
            };

            var offset={
                x:x-lastPoint.x,
                y:y-lastPoint.y
            }
            lastPoint={
                x:x,
                y:y
            };
            return offset;
        };
        resizer.frames.on(‘touchstart mousedown‘,function(event){
            getOffset(event);
        });
        resizer.frames.on(‘touchmove mousemove‘,function(event){
            if(!lastPoint)return;
            var offset=getOffset(event);
            resizer.moveFrames(offset);
        });
        resizer.frames.on(‘touchend mouseup‘,function(event){
            lastPoint=null;
        });
    })();
    return resizer;
};
var resizer=$.imageResizer(),
    resizedImage;

if(!resizer){
    resizer=$("<p>Your browser doesn‘t support these feature:</p><ul><li>canvas</li><li>Blob</li><li>Uint8Array</li><li>FormData</li><li>atob</li></ul>")
};

$(‘.container‘).append(resizer);

$(‘input‘).change(function(event){
    var file=this.files[0];
    resizer.resize(file,function(file){
        resizedImage=file;
    });
});

$(‘button.submit‘).click(function(){
    var url=$(‘input.url‘).val();
    if(!url||!resizedFile)return;
    var fd=new FormData();
    fd.append(‘file‘,resizedFile);
    $.ajax({
        type:‘POST‘,
        url:url,
        data:fd
    });
});
时间: 2024-10-05 10:52:15

H5实现图片优化上传的相关文章

基于H5+ API手机相册图片压缩上传

// 母函数 function App(){} /** * 图片压缩,默认同比例压缩 * @param {Object} path * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径 * @param {Object} obj * obj 对象 有 width, height, quality(0-1) * @param {Object} callback * 回调函数有一个参数,base64的字符串数据 */ App.prototype.dealImage

Html5+asp.net mvc 图片压缩上传

在做图片上传时,大图片如果没有压缩直接上传时间会非常长,因为有的图片太大,传到服务器上再压缩太慢了,而且损耗流量. 思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法得到base64字符串来实现压缩. 废话不多少不多说直接看代码: 本次测试使用了 zepto.min.js 插件,更新版本的下载请点击这里 主要js代码: //图片压缩处理 ; (function () { /** * 加载的时候进行抽样检测 * 在iOS中,大于2M的图片会抽样渲染 */ func

H5危险的文件上传对话框

文件对话框 文件上传对话框是一直以来就存在的网页控件. 到了 HTML5 时代,增加了更多的功能,例如支持文件多选.Chrome 甚至还支持「上传文件夹」这一私有特征: <input type="file" webkitdirectory /> 在给用户方便的同时,其安全隐患也逐渐出现.用户平时在下载时,理所当然的弹出的是保存对话框,因此常常不仔细看就做出了选择. 这极有可能被攻击者所利用.一些恶意网站在用户点击下载时,故意弹出一个上传对话框.只要用户一疏忽,就把选中的文件

base64格式的图片如何上传到oss

---恢复内容开始--- 对于base64图片的上传这个东西,一直是一个问题尤其是上传到oss.我们这次开发由于需要修剪图片,使用了h5的很多新特性. h5修剪图片,使用了我们的canvas.这个步骤是这样的.img->canvas->base64(by toDataURL).很多人走到了这个地方直 接懵逼,base64怎么上传啊.找了很多网上的,发现确实找不到,没什么人上传base64的教程.有点小绝望,感觉使用新特性, 修改图片可能是种错误的选择,然后出现了一个新的东西Blob对象,这个东

HTML5实现图片压缩上传功能

上篇文章中提到移动端上传图片,我们知道现在流量还是挺贵的,手机的像素是越来越高,拍个照动不动就是好几M,伤不起.虽然客户端可以轻轻松松实现图片压缩再上传,但是我们的应用还可能在浏览器里面打开,怎么办呢,图片压缩.受以前PC上的开发思维影响,尼玛js哪有权限去操作文件,哪有资格压缩图片啊,搞不了,你们客户端去整吧.只能说自己还是有些井底之蛙了.在HTML5的影响下,前端能干的事情越来越多了,开发的功能逼格也越来越高了,H5万岁!前端的魅力也在这,过去不可能的并不意味现在.以后不可能,努力吧,骚年!

C#中使用iframe结合js实现图片异步上传

将图片上传的页面放在iframe中,通过iframe跳转到另一个页面,在该页中将图片提交到服务器,而不需要对主页进行刷新,提交成功后用脚本(回调函数)实现上传的图片在主页面的显示. 图片选择页面 Add.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Add.aspx.cs" Inherits="_Add" %> <!DOCTYPE h

android图片压缩上传系列-service篇

本篇文章是继续上篇android图片压缩上传系列-基础篇文章的续篇.主要目的是:通过Service来执行图片压缩任务来讨论如何使用Service,如何处理任务量大的并发问题. 了解下Service 大家都知道如果有费时任务,这时需要将任务放到后台线程中执行,如果对操作的结果需要通过ui展示还需要在任务完成后通知前台更新.当然对于这种情况,大家也可以在Activity中启动线程,在线程中通过Handler和sendMessage来通知Activity并执行更新ui的操作,但是更好的方法是将这些操作

【方法】如何实现图片压缩上传

[参考文章] 前端实现图片压缩上传功能 H5实现图片先压缩再上传 原文地址:https://www.cnblogs.com/wannananana/p/12050442.html

onethink框架 编辑器图片没有上传权限

昨天遇到了一个有点蛋疼的问题,创建了一个用户,但是在添加数据的时候,发现编辑器中的图片上传不能使用老是提示下图的那种提示: 然后自己一直在想,怎么编辑器还要图片上传权限呢,淡淡的忧伤啊.然后自己琢磨了一会,发现自己解决不了.立马到Q群中询问,一问,还真的搞定了.原来是要设置权限,不过这个权限是框架数据中早就有了,我们只需要勾选上就可以了.当然了,我这种情况只适用于直接在框架demo上扩展使用的项目,如果完全是自己编写的,那就要看你们各自的构建是咋样的啦.废话不多说,上图:这下子清净了,搞定,再也