HTML5:使用Canvas和Input range控件放大缩小图片,剪裁,并上传图片
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>图片缩放</title>
</head> <body style="background: black;">
<input type="file" id="uploadFile"></input>
<img src="" id='image' style="display: none;">
<canvas id="canvas" style="display: block;margin: 0 auto;border: 1px solid #aaa;">
你的浏览器不支持canvas。
</canvas>
<input type="range" id="slider" min="0.5" max="3.0" step="0.01" value="1.0" style="display: block;margin: 20px auto;width: 800px;"/>
<button id='submit' value="上传">上传</button>
</body> <script>
var uploadbtn = document.getElementById('uploadFile');
var image = '';
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d"); var slider = document.getElementById("slider");
var imageObj = new Image(); //定义一个Image对象
canvas.width = 640;
canvas.height = 360; uploadbtn.onchange = function(){
var reader = new FileReader();
reader.onload = function(evt){
document.getElementById('image').src = evt.target.result;
image = evt.target.result; imageObj.src=evt.target.result; //加载图片 //需要等image load完再把它画到canvas中,不然的话可能有不良后果
imageObj.onload = function() {
drawImageByScale(slider.value); slider.onmousemove = function(){
drawImageByScale(slider.value);
};
}; }
reader.readAsDataURL(arguments[0].target.files[0]);
} document.getElementById('submit').onclick = function(){
var dataurl = canvas.toDataURL('image/png');
var blob = dataURLtoBlob(dataurl);
//使用ajax发送
var fd = new FormData();
fd.append("file", blob, "image.png");
var xhr = new XMLHttpRequest();
xhr.open('POST', 'url', true);
xhr.send(fd);
} function drawImageByScale(scale){
var x_ = document.getElementById("image").width;
var y_ = document.getElementById("image").height;
if((x_/y_)>(16/9)){
var imageWidth = 640 * scale;
var imageHeight = 640*y_/x_ * scale;
}else{
var imageHeight = 360 * scale;
var imageWidth = 360*x_/y_ * scale;
} //画布上的起始点:画布的大小一半减去图像大小的一半。可以为负数,表示在左上角的外面。
var dx = canvas.width/2 - imageWidth/2;
var dy = canvas.height/2 - imageHeight/2;
//清空画布
context.clearRect(0, 0, canvas.width, canvas.height); //把image画到canvas中,dx、dy表示起始点坐标
context.drawImage(imageObj, dx, dy, imageWidth, imageHeight);
} function dataURLtoBlob(dataurl) {
var arr = dataurl.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>
</html>
HTML5:使用Canvas和Input range控件放大缩小图片,剪裁,并上传图片的更多相关文章
- 为什么Jquery对input file控件的onchange事件只生效一次
今天在做jquery对input file控件的onchange事件进行监听,就一直只生效一次,不知道Jquery为什么对file控件没有做到每次改变触发onchange事件的效果,但是还是有好几种解 ...
- 微信小程序基础之input输入框控件
今天主要详写一下微信小程序中的Input输入框控件,输入框在程序中是最常见的,登录,注册,获取搜索框中的内容等等都需要,同时,还需要设置不同样式的输入框,今天的代码中都要相应的使用. input输入框 ...
- input(Text)控件作为填空输入,但运行后,有曾经输入的记录显示,用autocomplete="off"解决
系统中,有设计填空题,原来程序中,用input(Text)控件, <input type="text" name="NO<%=rs("id&qu ...
- jquery检测input checked 控件是否被选中的方法
jquery检测input checked 控件是否被选中 js部分 复制代码代码如下: function tongyianniu(){ var gouxuan=$('input[type=check ...
- 使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件
使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件 原来的写法: <input type="file" accept="image/x-png ...
- WebView使用input file控件打开相册上传图片
使用 WebView 直接用 控件选择相册图片 package com.moguzhuan.android.zhuan; import android.annotation.TargetApi; im ...
- QlikView TEXT控件固定显示图片
QlikView 的Text控件不仅可以用来展示文本也可以用来展示图片. 数据表 2个列,一个是 关联字段(Country),另外一个保存图片物理路径. TEXT控件固定显示图片 ,编辑控件表达式 = ...
- wpf image控件循环显示图片 以达到动画效果 问题及解决方案
1>最初方案: 用wpf的image控件循环显示图片,达到动画效果,其实就是在后台代码动态改变Image.Source的值,关键代码: ; i < ; i++)//六百张图片 { Bitm ...
- 在RichTextBox控件中插入图片
. 在RichTextBox控件中插入图片 关键点 . 实现过程 . public void ShowInsertImageDlg() { OpenFileDialog OpenFileD ...
随机推荐
- docker-compose (单机版的容器编排工具)
类似于ansible剧本 yml 格式 要使用这个编排工具,必须先安装 yum install -y docker-compose cd wordpress/ vi docker-compose.ym ...
- ImportError: cannot import name webdriver解决方案
在sublime写一个Python程序的时候,使用from selenium import webdriver,在run的时候却出现ImportError: cannot import nam ...
- Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1
Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1 C. Jumping Transformers 我会状压 DP! 用 \(dp[x][y][ ...
- html--伪等高布局
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- [JZOJ4684] 【GDOI2017模拟8.11】卡牌游戏
题目 描述 题目大意 有111到2n2n2n牌,一开始分别给两个人,每人nnn张. 轮流出牌,给出对手出牌的顺序,若自己的牌更大,就记一分. 在中间的某个时刻可以改变游戏规则. 问最大的分数. 思考历 ...
- ThinkPHP可以支持直接使用字符串作为查询条件
ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用数组或者对象来作为查询条件,因为会更加安全. 大理石平台哪家好 一.使用字符串作为查询条件 这是最传统的方式,但是安全性不高, ...
- 「题解」:windy数
问题: windy数 时间限制: 1 Sec 内存限制: 512 MB 题面 题目描述 Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 的正整数被称为 Windy 数. ...
- 自己整理的一个访问SQLite3数据库的C++类
原文地址:自己整理的一个访问SQLite3数据库的C++类作者:vigra 近日,对SQLite3的使用进行了研究.真不愧是优秀的嵌入数据库,API接口也极其简捷.基本上只要使用以下几个接口就能完成数 ...
- 莫烦pytorch学习笔记(七)——Optimizer优化器
各种优化器的比较 莫烦的对各种优化通俗理解的视频 import torch import torch.utils.data as Data import torch.nn.functional as ...
- Appium环境安装步骤 + 代码验证环境是否成功
1.安装Microsoft .NET Framework 4.5 检测本机已安装的程序中,是否已经安装Microsoft .NET Framework 4.5及以上的版本. 如下图所示: 如果没有 ...