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. 如何修改discuz论坛的图像地址

    今天帮别人修改discuz论坛,遇到一个问题,就是图像显示不出来,按F12键后,发现是自己的图像路径设置有问题,于是就要去修改这个设置路径了.有两种方法: 一,直接修改配置文件,打开config/co ...

  2. LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree

    这是悦乐书的第197次更新,第203篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第59题(顺位题号是235).给定二叉搜索树(BST),找到BST中两个给定节点的最低共 ...

  3. [福大软工] Z班——个人技术博客评分

    个人技术博客 作业地址 https://edu.cnblogs.com/campus/fzu/SoftwareEngineering2015/homework/1070 作业要求 个人技术博客单次作业 ...

  4. 使用selenium时,使用从系统启动浏览器与通过自动化驱动方式启动浏览器控件ID不一样解决方法

    最近遇到一个怪事,通过正常打开浏览器,按照正常的web登录然后点击进入系统流程,将各控件的ID识别成功,然后使用 python3+selenium写好脚本,高高兴兴的用脚本跑时老是提示找不到控件,然后 ...

  5. JavaScrip 入门第一课

    一.代码引入的三种方式 1.直接在head中书写 在head标签里面可以写,在body标签里面也可以写,放到head标签里面和放到body标签里面到底有什么区别,我们后续在讲~ <head> ...

  6. 【大数据技术】Hadoop三大组件架构原理(HDFS-YARN-MapReduce)

    目前,Hadoop还只是数据仓库产品的一个补充,和数据仓库一起构建混搭架构为上层应用联合提供服务. Hadoop集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起. ...

  7. Teradata的profile使用

    1.proflie优势 使用profile可以批量管理用户参数,尤其是在一批用户具有相同的参数配置时,十分便捷. 2.profile可配置用户参数 [Account id][Default datab ...

  8. NGINX Load Balancing – TCP and UDP Load Balancer

    This chapter describes how to use NGINX Plus and open source NGINX to proxy and load balance TCP and ...

  9. Jenkins+Ansible+Gitlab自动化部署三剑客-Ansible本地搭建

    可以通过git bash连接linux 关闭防火墙,禁用防火墙开机启动,并更爱selinux文件,重启 重新登录并检查禁用 getenforce 安装git yum -y install git ns ...

  10. @RequestParam 和@RequestBody 的区别?

    @RequestParam用来接收: 1 用来处理简单的参数绑定 2 用来接收 Content-Type 是   application/x-www-form-urlencoded (这种格 式的数据 ...