H5上传图片之canvas,使用canvas处理压缩图片再上传

html代码:

<form action="" method="post">
<dl>
<dd>
<div>
<div id="img_wrap"> </div>
<input type="file" accept="image/jpg,image/jpeg,image/png,image/gif" id="fileImage" multiple="multiple" name="img" style="display:none" />
<a id="upimg" href="javascript:">上传图片</a>
</div>
</dd>
<dd style="margin-top:10px;">
<a id="abtn_submit" href="javascript:">提交</a>
</dd>
</dl>
</form>

js代码:

<script type="text/javascript">
$(function () {
$("#abtn_submit").click(function () {
if ($("input[name='imgs']").length < 1) {
layer.open({
content: '必须上传图片才能提交',
skin: 'msg',
time: 2
});
return;
}
$("form").submit();
});
$("#upimg").click(function () {
$("#fileImage").click();
})
$("#fileImage").change(function () {
$.each($(this)[0].files, function (i, e) {
if (!/image\/\w+/.test(e.type)) {
//请确保文件为图像类型
return;
}
imgHandle(e);
})
})
}); function imgHandle(_file) {
var reader = new FileReader();
reader.readAsDataURL(_file);
reader.onload = function (e) {
var result = e.target.result;
var image = new Image();
image.src = result;
image.onload = function () {
var cvs = document.createElement("canvas");
var scale = 1;
if (this.width > 1000 || this.height > 1000) {
if (this.width > this.height) {
scale = 1000 / this.width;
}
else {
scale = 1000 / this.height;
}
}
cvs.width = this.width * scale;
cvs.height = this.height * scale;
var ctx = cvs.getContext("2d");
ctx.drawImage(this, 0, 0, cvs.width, cvs.height);
var newImageData = cvs.toDataURL(_file.type, 0.8);
var imgdata = "<a href='javascript:' onclick='delimg(this)'><img src=\"" + newImageData + "\" />";
imgdata += "<input type=\"hidden\" name=\"imgs\" value=\"" + newImageData + "\" /></a>";
$("#img_wrap").append(imgdata);
}
}
} function delimg(e) {
layer.open({
content: '您确定要删除此图片吗?',
btn: ['删除', '取消'],
skin: 'footer',
yes: function (index) {
$(e).remove();
layer.close(index);
}
});
}
</script>

  后台处理代码:

//有图片时处理如下
string[] imgs = collection.GetValues("imgs");
List<U_Img> uimglist = new List<U_Img>();
int i = 1;
foreach (string imgBase64Str in imgs)
{
int indexOf = imgBase64Str.IndexOf('/') + 1;
string ftype = imgBase64Str.Substring(indexOf, imgBase64Str.IndexOf(';') - indexOf);
string fex = ".jpg";
switch (ftype)
{
case "jpeg":
case "jpg":
fex = ".jpg";
break;
case "png":
fex = ".png";
break;
case "gif":
fex = ".gif";
break;
}
string Base64Str = imgBase64Str.Substring(imgBase64Str.IndexOf(',') + 1);
Base64Str = Base64Str.Trim('\0');
byte[] imgArr = Convert.FromBase64String(Base64Str);
using (MemoryStream ms = new MemoryStream(imgArr))
{
Bitmap bmp = new Bitmap(ms);
string fname = "/timg/" + DateTime.Now.ToString("yyMMddmmHHssffff") + i.ToString() + fex;
string FilePath = Request.MapPath(fname);
bmp.Save(FilePath);
uimglist.Add(new U_Img() { ImgUrl = fname, ImgTime = DateTime.Now });
}
i++;
}

  

H5上传图片之canvas的更多相关文章

  1. H5上传图片并使用canvas制作海报

    马上就要"十一"国庆节了,又恰逢公司已经三周岁了,所以市场部和产品共同策划了一个"正青春,共成长"的主题代言活动,准备在国庆节以及中秋节期间让公司员工和用户为公 ...

  2. angular下H5上传图片(可多张上传)

    最近做的项目中用到了angular下上传图片功能,在做的过程中遇到了许多问题,最终都得以解决 angular上传时和普通上传时过程差不多,只不过是要不一些东西转化为angular的东西. 1.ng-f ...

  3. h5上传图片

    1.如何在H5上传图片 使用FileReader 2.FileReader接口 传图片我们只用到readAsDataURL 3.FileReader接口事件 传图片我们只用到onload 4.如何使用 ...

  4. 用H5中的Canvas等技术制作海报

    在去年的时候也实现过合成海报的功能,不过当时时间仓促,实现的比较简单. 就一个旋转功能,图片也不能拖动放大,也不能裁剪. 去年的实现可以参考<移动图片操作--上传>和<移动图片操作- ...

  5. h5上传图片及预览

    第一次做图片上传,记录一些问题. 1,图片的base64编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址.而网页上的每一个图片,都是需要消耗一个http请求下载而来的,使用base ...

  6. H5神器之canvas应用——网页修改保存图片

    因为最近项目上的要求,需要在页面中可以对一张图片进行涂改和添加文字,然后再保存到(服务器)本地,因为也是第一次接触这方面的,然后爬网页啊爬网页,之后发现了一款adobe开发的一款插件,适合 Anroi ...

  7. 关于H5中的Canvas API的探索

    Canvas API 是H5中比较炫酷的一部分内容.可以通过它动态的生成和展示图形.图表.图像以及动画.下面我将学习一下Canvas API. 最后有书籍和源码. 一.概述: 1.基本元素: 在网页上 ...

  8. 从web图片裁剪出发:了解H5中的canvas

    本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 重说三,好了,现在进 ...

  9. H5之画布canvas小记,以及通过画布实现原子无规则运动

    我们知道html在h5出之前就仅仅只是一个标签,一个标记,语义化并不强,后来新增的标签如video,audio都是语义化更强(让人一看就懂是什么东西,反正我是这么理解的,一个div不代表着什么),本身 ...

随机推荐

  1. hive笔记:复杂数据类型-array结构

    array 结构 (1)语法:array(val1,val2,val3,…)  操作类型:array array类型的数据可以通过'数组名[index]'的方式访问,index从0开始: (2)建表: ...

  2. Linux系统将服务器时间与网络时间同步

    遇到一种情景,就是多台服务器之间的时间并不是同步的,有的快有的慢,这时候就要用到网络时间了, 登陆到服务器上,输入命令date可以查询服务器的时间,需要同步的时候需要安装ntpdate; 1.  安装 ...

  3. js获取请求地址后面带的参数

    浏览器输入页面地址的时候在后面带有请求参数, 页面加载后需要获取携带的参数, 可以使用js, 在页面加载js的时候获取参数 http://localhost:8080/demo/index.html? ...

  4. 聚类——GAKFCM的matlab程序

    聚类——GAKFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——GAKFCM文章中已介绍了GAKFCM算法的理论知识, ...

  5. C#基础知识之List和数组之间的转换

    1,从System.String[]转到List<System.String> System.String[] str={"str","string" ...

  6. 1. 路过面了个试就拿到2个offer。是运气吗?

    路过随便面个试就拿到2个offer.是运气吗? #复习很重要#看看面试问的问题,再瞧瞧师兄的学习态度,你就明白 机会为何总与你擦肩而过了.[玫瑰] 以下是我和师兄的聊天记录,你会几个?

  7. j旧学习

    多态的动态绑定: 签名 方法名和参数列表  不同参数叫重载,覆盖父类签名叫覆盖 类加 final不可继承 方法加final不可覆盖 强制类型转换  (类型)对象 抽象类 只要有一个抽象方法就是抽象类, ...

  8. own address as source address

    1222.762730] br0: received packet on nbif0 with own address as source address[ 1222.769697] br0: rec ...

  9. (转)Spring Boot (十):邮件服务

    http://www.ityouknow.com/springboot/2017/05/06/spring-boot-mail.html Spring Boot 仍然在狂速发展,才几个多月没有关注,现 ...

  10. Django-rest-framework 接口实现 限制:(Throttle)

    限制:(Throttle) 主要用来限制 单独一个用户的 访问次数 自定义一个 限制类 创建一个Throttle.py(截流)文件 注意 一定要写两个方法 def allow_request(self ...