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. vue2 学习笔记2

    文中例子代码请参考github 品牌管理案例 添加新品牌 <body> <div id="app"> <div class="panel p ...

  2. 安装.NET Core遇到的错误

    如果验证出现如下错误 Failed to load /opt/dotnet/shared/Microsoft.NETCore.App/1.1.0/libcoreclr.so, error: libun ...

  3. c/c++ 线性表之顺序表

    线性表之顺序表 存储在连续的内存空间,和数组一样. 下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit). 实现了以下功能: 函数 功能描述 ...

  4. Windows Server 2016-管理Active Directory复制任务

    Repadmin.exe可帮助管理员诊断运行Microsoft Windows操作系统的域控制器之间的Active Directory复制问题. Repadmin.exe内置于Windows Serv ...

  5. fedora 29 桌面版 设置 cockpit 自动开机启动

    systemctl enable cockpit 时,会出现如下错误: The unit files have no installation config (WantedBy, RequiredBy ...

  6. Python闭包和装饰器再复习

    闭包 闭包的定义 在一个外函数中定义了一个内函数,并且内函数用到了外部函数的变量,而且外函数的返回值是内函数的引用,这就构成了一个闭包. 一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东 ...

  7. ccf 再买菜 搜索 dfs

    //递推关系式:(b[n-1]+b[n]+b[n+1])/3=a[n] //所以b[n+1]=3*a[n]-b[n-1]-b[n],或b[n+1]=3*a[n]-b[n-1]-b[n]+1,或b[n+ ...

  8. ElasticSearch(四):使用Java连接ElasticSearch集群

    public class ESIndexMapping { private static String host="192.168.56.3"; // 服务器地址 private ...

  9. SQLite 知识摘要 --- 线程模式、事务模式

    本篇主要从SQLite事务执行的原理中寻找如何更高效地使用它. 本篇预备知识 我们先来了解下SQLite执行事务的基本流程,状态变化过程,再分析怎么使用才更优.SQLite定义的锁的状态有如下几种: ...

  10. AJAX方式发送远程请求报错:No 'Access-Control-Allow-Origin' header

    AJAX GET方式发送远程请求,chrome开发者工具console中报错:XMLHttpRequest cannot load http://www.shikezhi.com/ajax/getDa ...