h5 canvas 图片上传操作

最近写的小 demo,使用的是h5的 canvas来对图片进行放大,移动,剪裁等等
这是最原始的代码,比较接近我的思路,后续会再对格式和结构进行优化

html:

1 <pre name="code" class="brush: html;" rows="15" cols="300">
2 <input type="file" name="" accept="image/gif, image/jpeg" id="upload">
3 <canvas id="showimg" style="border:1px solid #aaa;"></canvas>
4 <p>移动:</p>
5 <input type="range" min="0" max="2" id="move" step="0.01" value="1" class="range-control" oninput="translateall()"/><br/>
6 <button id="crop">剪裁输出</button>
7 <img id="img" src="" style="border:1px solid #aaa;">

js:

  1 var img = new Image();
  2 var can = document.getElementById(‘showimg‘);
  3 var ctx = can.getContext("2d");
  4 can.width = 500;
  5 can.height = 400;
  6 var fictitious_imgwidth,fictitious_imgheight,flag;
  7 var distance_x = 0;
  8 var distance_y = 0;
  9 var orign_x,orign_y//鼠标点击时的坐标
 10 var present_x,present_y//记录图片做上角的坐标
 11 var substitute_x,substitute_y//暂时记录图片左上角坐标
 12 ctx.fillStyle = "#aaa";
 13 ctx.fillRect(0,0,500,400);
 14 ctx.beginPath();
 15 ctx.moveTo(100,100);
 16 ctx.lineTo(400,100);
 17 ctx.lineTo(400,300);
 18 ctx.lineTo(100,300);
 19 ctx.lineTo(100,100);
 20 ctx.lineWidth = 3;
 21 ctx.strokeStyle = ‘#333‘
 22 ctx.stroke();
 23 ctx.clip();
 24 ctx.closePath();
 25 ctx.clearRect(0, 0, can.width, can.height);
 26 $(‘#upload‘).change(function(){
 27     console.log(‘this is runing‘)
 28     ctx.clearRect(0, 0, can.width, can.height);
 29
 30     img.onload = function(){
 31         fictitious_imgwidth = img.width;
 32         fictitious_imgheight = img.height;
 33         present_x = can.width*0.5-img.width*0.5;
 34         present_y = can.height*0.5-img.height*0.5;
 35         ctx.drawImage(img,present_x,present_y,img.width,img.height);
 36     }
 37     img.src = getFileUrl(‘upload‘);
 38
 39 })
 40 function translateall(){
 41     var val = document.getElementById("move").value;
 42     reprint(val)
 43 }
 44 function reprint(scale){
 45     ctx.clearRect(0, 0, can.width, can.height);
 46     fictitious_imgwidth = img.width*scale;
 47     fictitious_imgheight = img.height*scale;
 48     check_present();
 49     ctx.drawImage(img,present_x,present_y,fictitious_imgwidth,fictitious_imgheight)
 50 }
 51 function getFileUrl(sourceId) {
 52     var url;
 53     if (navigator.userAgent.indexOf("MSIE")>=1) { // IE
 54         url = document.getElementById(sourceId).value;
 55     } else if(navigator.userAgent.indexOf("Firefox")>0) { // Firefox
 56         url = window.URL.createObjectURL(document.getElementById(sourceId).files.item(0));
 57     } else if(navigator.userAgent.indexOf("Chrome")>0) { // Chrome
 58         url = window.URL.createObjectURL(document.getElementById(sourceId).files.item(0));
 59     }
 60     return url;
 61 }
 62 $(‘#showimg‘).mousedown(function(e){
 63     console.log(‘mousedown is running‘)
 64     orign_x = e.offsetX;
 65     orign_y = e.offsetY;
 66     judgment_isinimg(e);
 67
 68 }).mousemove(function(e){
 69     if(flag){
 70         distance_x = e.offsetX - orign_x;
 71         distance_y = e.offsetY - orign_y;
 72         ctx.clearRect(0, 0, can.width, can.height);
 73         substitute_x = present_x + distance_x;
 74         substitute_y = present_y + distance_y;
 75         ctx.drawImage(img,substitute_x,substitute_y,fictitious_imgwidth,fictitious_imgheight);
 76
 77     }
 78 }).mouseleave(function(){
 79     flag = false
 80     present_x = substitute_x;
 81     present_y =substitute_y;
 82 }).mouseup(function(){
 83     flag = false
 84     present_x = substitute_x;
 85     present_y =substitute_y;
 86 })
 87
 88 function judgment_isinimg(e){
 89     var ll = present_x
 90     var lt = present_y
 91     var rl = present_x+fictitious_imgwidth
 92     var rt = present_y+fictitious_imgheight
 93
 94
 95     var x=event.clientX-can.getBoundingClientRect().left;
 96     var y=event.clientY-can.getBoundingClientRect().top;
 97
 98     if(ll < x && x < rl && lt < y && y < rt){
 99         flag = true;
100     }else{
101         flag = false;
102     }
103 }
104
105 function check_present(){
106     if(typeof present_x == ‘undefined‘ || typeof present_y == ‘undefined‘){
107         present_x = can.width*0.5-fictitious_imgwidth*0.5;
108         present_y = can.height*0.5-fictitious_imgheight*0.5;
109     }
110 }
111
112 $(‘#crop‘).click(function(){
113     crop_canvas = document.createElement(‘canvas‘);
114     crop_canvas.width = 300;
115     crop_canvas.height = 200;
116     crop_ctx =crop_canvas.getContext(‘2d‘)
117     crop_ctx.fillStyle = "#fff";
118     crop_ctx.fillRect(0,0,300,200);
119     check_present();
120     crop_ctx.drawImage(img,Number(present_x)-100,Number(present_y)-100,fictitious_imgwidth,fictitious_imgheight);
121     var fullQuality = crop_canvas.toDataURL(‘image/jpeg‘, 1.0);
122     $(‘#img‘).attr(‘src‘,fullQuality);
123 })
时间: 2024-10-22 21:05:47

h5 canvas 图片上传操作的相关文章

H5 实现图片上传预览

1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="utf-8" /> 6 <title>图片上传预览</title> 7 <style> 8 .check_box{ 9 position: relative; 10 width: 100px; 11 height: 100px; 12 margin: 20px; 13 display: flex

H5压缩图片上传(FileReader +canvas)

因为最近项目做一个webApp的页面,需要上传图片,总结了一下,思路如下: 一.监听一个 input (type='file') 的 change 事件,然后拿到文件的 file; <input id="img-input" class="upload-input" type="file" accept="image/*" id="imgbox" multiple/> 二.把 file 转成 d

vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理

一.前言 三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学习. 图片的上传之前都是用的插件(ajaxupload),或者传统上传图片的方式,各有利弊:插件的问题是依赖jq并且会使系统比较臃肿,还有传统的web开发模式 前后端偶尔在一起及对用户体验要求低,现在公司采用webpack+vue+restfullApi开发模式 前后端完全分离,遵从高内聚,低偶尔的原则,开发人员各司其职,一则提升开发效率(从长期来看,短期

node.js框架express文件上传操作

1.创建upload.html文件 <form action='/upload' method='post' enctype='multipart/form-data'> 头像:<input type='file' name='userImg'/><br/> <input type='submit' value='上传头像'/> <!-- 使用file上传图片的注意事项: 1. method上传方式必须是post 2. enctype='multipa

HTML5+Canvas+jQuery调用手机拍照功能实现图片上传(二)

上一篇只讲到前台操作,这篇专门涉及到Java后台处理,前台通过Ajax提交将Base64编码过的图片数据信息传到Java后台,然后Java这边进行接收处理,通过对图片数据信息进行Base64解码,之后使用流将图片数据信息上传至服务器进行保存,并且将图片的路径地址存进数据库.ok,废话不多说了,直接贴代码吧. 1.前台js代码: $.ajax({ async:false,//是否异步 cache:false,//是否使用缓存 type: "POST", data:{fileData:fi

megapix-image插件 使用Canvas压缩图片上传

<!DOCTYPE html > <html> <head> <title>通过Canvas及File API缩放并上传图片</title> <script src="/Scripts/Jquery/jquery-1.8.3.min.js" type="text/javascript"></script> <script src="/Scripts/MegaPixIm

megapix-image插件 使用Canvas压缩图片上传 解决手机端图片上传功能的问题

最近在弄微信端的公众号.订阅号的相关功能,发现原本网页上用的uploadify图片上传功能到手机端有的手机类型上就不能用了,比如iphone,至于为啥我想应该不用多说了吧(uploadify使用flash实现上传的): 经过研究找到了一个手机端比较相对比较好用的插件实现图片上传,那就是megapix-image插件,比uploadify还是好用多了,下面就来上实例吧: html页面: <html> <body> <input type="file" cap

使用canvas给图片添加水印, canvas转换base64,,canvas,图片,base64等转换成二进制文档流的方法,并将合成的图片上传到服务器,

一,前端合成带水印的图片 一般来说,生成带水印的图片由后端生成,但不乏有时候需要前端来处理.当然,前端处理图片一般不建议,一方面js的处理图片的方法不全,二是有些老版本的浏览器对canvas的支持度不够. 下面我们就说说,利用canvas 生成带水印的图片. 1.我们要实现一下效果 2.创建一个canvas var canvas = document.createElement('canvas'); var time = new Date(); var logoCanvas =time+' '+

H5拍照、选择图片上传组件核心

背景 前段时间项目重构,改成SSR的项目,但之前用的图片选择上传组件不支持SSR(server-side-render).遂进行了调研,发现很多的工具.但有的太大,有的使用麻烦,有的不满足使用需求.决定自己写一个h5移动端图片上传组件.图片上传是一个比较普遍的需求,PC端还好,移动端就不是特别好做了.下面将过程中一些重点的问题进行简单的记录. 重点 1.关于input 选择功能使用<input>标签实现.属性accept='image/*',:capture表示,可以捕获到系统默认的设备,比如