H5 canvas实现客户端压缩图片上传

前端图片压缩解决办法 本篇文章提供前端图片压缩的方法 阅读详情

现在手机随随便便拍个照都是5、6MB,如果用户提交图片,即占服务器资源,上传速度又慢,影响用户体验度,所以一般都会对图片进行处理。
之前用php写过一个压缩图片程序,是先将图片上传到服务器之后,在服务器端进行压缩,效果不是很理想。
后来想想,还是决定要在客户端压缩,依靠H5的canvas来对图片在本地进行压缩处理,将图片处理成为base64编码,然后发送到后台,后台再做处理然后存储就好了(这样就是普通的post的提交了)。
这样比较友好些,无论是对服务器还是对用户。


html代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
        <title>压缩上传为base64</title>
        <script src="../src/jquery.min.js"></script>
    </head>

    <body >
        <form id="form1" name="form1" method="post" action="">
            <input type="file" name="fileToUpload" id="fileToUpload"/> <br />
            <input type="text" name="compressValue" id="compressValue" style="display:none;" /><br/>
            <input type="button" id='uploadBtn' value="上传" /><br/>
        </form>
    </body>
    <script type="text/javascript">

        //图片上传change事件
        $('#fileToUpload').change(function(){
            uploadBtnChange();
        });

        //提交click事件
        $('#uploadBtn').click(function(){
            var preview = document.getElementById('compressValue').value;
            if(preview){
                $.ajax({
                    url:"index.php",
                    type: "POST",
                    data:{'imgBase64':preview},
                    dataType:'json',
                    success:function(json) {
                        alert(json);
                   },
                   error:function(){
                       alert('操作失败,请跟技术联系');
                   } 
                });
            }
        });

        function uploadBtnChange(){
            var scope = this;
            if(window.File && window.FileReader && window.FileList && window.Blob){ 
                //获取上传file
                var filefield = document.getElementById('fileToUpload'),
                    file = filefield.files[0];
                //获取用于存放压缩后图片base64编码
                var compressValue = document.getElementById('compressValue');
                processfile(file,compressValue);
            }else{
                alert("此浏览器不完全支持压缩上传图片");
            }
        }

        function processfile(file,compressValue) {
            var reader = new FileReader();
            reader.onload = function (event) {
                var blob = new Blob([event.target.result]); 
                window.URL = window.URL || window.webkitURL;
                var blobURL = window.URL.createObjectURL(blob); 
                var image = new Image();
                image.src = blobURL;
                image.onload = function() {
                    var resized = resizeMe(image); 
                    compressValue.value = resized;
                }
            };
            reader.readAsArrayBuffer(file);
        }

        function resizeMe(img) {
            //压缩的大小
            var max_width = 1920; 
            var max_height = 1080; 

            var canvas = document.createElement('canvas');
            var width = img.width;
            var height = img.height;
            if(width > height) {
                if(width > max_width) {
                    height = Math.round(height *= max_width / width);
                    width = max_width;
                }
            }else{
                if(height > max_height) {
                    width = Math.round(width *= max_height / height);
                    height = max_height;
                }
            }

            canvas.width = width;
            canvas.height = height;

            var ctx = canvas.getContext("2d");
            ctx.drawImage(img, 0, 0, width, height);
            //压缩率
            return canvas.toDataURL("image/jpeg",0.92); 
        }       
    </script>
</html>

php代码:

header('Content-type:text/html;charset=utf-8');
$base64_image_content = $_POST['imgBase64'];
//echo $base64_image_content;die;
//匹配出图片的格式
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
    $type = $result[2];
    $new_file = './upload/';

    //如果文件不存在,则创建
    if(!file_exists($new_file))
    {
        mkdir($new_file, 0777, true);
    }

    $new_file = $new_file.time(). '.' .$type;
    if (file_put_contents($new_file, base64_decode(str_replace($result[1],'', $base64_image_content)))){
        echo json_encode('上传成功!');
    }else{
        echo json_encode('上传失败!');
    }
}

注意:
1、部分代码是参照网上的,安全性不能全部保证
2、运行index.html选择要上传的图片文件点击上传
3、必须配置安装在php服务器中使用,否则有些功能不能正常使用(但压缩图片不受影响)
4、仅支持主流及ie9以上浏览器,ie9以下请单独做处理。

移动端H5图片上传优化:3步实现图片压缩与Base64编码上传 本文详细介绍了移动端H5图片上传的性能优化方案,包括前端图片压缩、Base64编码上传和分块上传技术。通过Canvas API实现高效图片压缩,结合EXIF方向校正和Web Worker后台处理,显著提升上传速度和用户体验。文章还提供了完整的代码示例和跨平台兼容性解决方案,帮助开发者快速实现移动端H5图片上传功能。 阅读详情

相关推荐

别再被坑了!UniApp H5端图片上传的完整避坑指南(含iOS大文件超时处理)

本文深入解析UniApp H5端图片上传的常见问题,包括文件格式不兼容、iOS大文件上传超时等,并提供完整的解决方案。通过实战代码示例,详细讲解文件对象转换、图片压缩、超时处理等关键技术点,帮助开发者高效实现H5端图片上传功能,特别针对iOS系统的特殊限制提供了优化方案。

weixin_29196891的博客 157

html canvas压缩图片

function compress(img) { var initSize = img.src.length; var width = img.width; var height = img.height; //如果图片大于四百万像素,计算压缩比并将大小压至400万以下 var ratio; if

yeyuehunluhongyu的博客 810

H5项目实战:uView Upload组件图片压缩上传避坑指南(附完整代码)

本文针对H5环境下uView Upload组件图片压缩上传的常见问题,提供了完整的解决方案与避坑指南。文章详细解析了基于Canvas的图片压缩技术原理,并封装了健壮的压缩工具库,最后深度集成uView组件,给出了包含智能策略、内存管理及错误处理的完整实战代码,帮助开发者高效实现H5项目的图片上传功能。

weixin_28040125的博客 113

html5 canvas压缩上传图片,HTML5+Canvas实现图片的压缩上传详解

本篇教程探讨了HTML5+Canvas实现图片的压缩上传,希望阅读本篇文章以后大家有所收获,帮助大家对HTML5的理解更加深入。在任何项目中,图片的上传都是很常用的功能,在html5未普及之前,人们用插件来实现这个功能,比如jquery.fileupload.js,这些插件虽然功能强大,但是总觉得挺麻烦。如果你的功能的浏览器要求是在IE10以上,那么不妨用html5的FileReader对象来实现...

weixin_32520565的博客 590

前端Canvas与AI生成技术融合:PixVerse Canvas素材创作实践指南

HTML5 Canvas作为Web端强大的图形渲染技术,其核心原理在于通过JavaScript API在网页上动态绘制2D图形与图像。结合当下热门的AI生成技术,如文生图、图生图模型,前端开发者能够构建出智能化的视觉内容创作工具。这种技术融合的价值在于显著降低了动态素材、营销海报等视觉内容的生产门槛,实现了从设计到成品的自动化流程。其典型应用场景包括社交媒体图片批量生成、Web应用内嵌AI绘图功能以及教育类创意工具开发。本文聚焦于如何将Canvas绘图能力与AI服务API(如PixVerse)进行工程化集成

weixin_30824479的博客 366

手把手教你学Simulink——基于Simulink的轮毂电机独立驱动转矩矢量分配

阐述了轮毂电机独立驱动的核心价值与转矩分配的必要性在 Simulink 中实现了完整的“上层稳定控制 + 下层最优分配”架构对比了三种分配策略在极限工况下的性能差异提供了工程落地的关键考量特斯拉 Cybertruck(后轮双电机矢量控制)Rivian R1T(四电机坦克掉头)宝马 iX(精准牵引力控制)核心思想“以软件定义底盘,以算法驾驭动力;化四轮之独立,为整车之协同。—— 让汽车在极限边缘依然从容不迫。

MHD0815的博客 369

HTML5利用canvas压缩图片(不改变图片宽和高)

最近项目中有一个手机拍照上传的需求,现在的智能手机摄像头像素很高,拍出来的照片大小大都在5M左右,当手机在上传图片时遇到了问题,之前采用的方法是将图片先进行Base64编码,然后上传到服务器,结果因为图片太大,导致服务器老是回复超时错误;权衡之下决定在图片上传之前先将图片压缩; 以下为我采用方法的源码: &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&...

一捆铁树枝的博客 3988

图解B树的原理及操作

本文主要参考:https://blog.youkuaiyun.com/shenchaohao12321/article/details/83243314 1. B树 1.1 B树的定义 B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 一颗m阶的B树定义如下: 1)每个结点最多有m-1个关键字。 2)根结点最少可以只有1个关键字。 3)非根结点至少有Math.ceil(m/2)-

jinking01的专栏 3万+

HTML5实现图片压缩上传(详解)

HTML5实现图片压缩上传,主要用到FileReader, canvas, Blob,FormData这几个api 1,fileReader用来读取文件 2,利用canvas.toDataURL('"image/jpeg",quality)中的quality参数进行图片压缩 3,将图片base64格式转化为blob对象 4,利用formData上传 首先介绍下FileReader, c...

前端361 5012

ISO15118-20证书结构关系解读(7.3.2.1)

本文主要讲述ISO15118-20:2022标准所有证书结构的关联关系,目的是为后续基于ISO15118-20车桩通讯及PNC充电等提供基础支撑。 本文所有的证书关系图全部来源于ISO15118-20:2022标准规范,在后续的讲解过程会将图的摘取出处给提供出来,便于后期文章和标准对应起来解读。

weixin_40900932的博客 3184

麒麟信安3.3-6C电网版虚拟机安装避坑指南:从ISO下载到SSH配置全流程

本文提供麒麟信安3.3-6C电网版虚拟机的详细安装与配置指南。针对电力行业仿真测试需求,重点解析从ISO镜像获取、虚拟机环境准备、安装过程中的三大“雷区”(如多管理员密码逻辑、分区方案、网络配置)到首次启动后的网络、SSH及root策略配置的全流程避坑要点,帮助技术人员高效、安全地完成部署。

rainy的博客 855

canvas进行图片压缩

canvas进行压缩 最近公司的一个H5活动,搜狐新闻客户端开机图制作,需要用户上传一张图片之后,先显示出来再进行裁剪,然后上传base64字符串到服务器上。 但是问题来了,用户一般上传的图片文件的大小都在3-5M左右,转成base64后提交给服务器的话实在是太大了,到时上传到服务器的时候服务器超时了(都是泪啊!),所以这里需要先压缩下图片。 偶然间想起来可以用canvas进行图片压缩,因为这个H...

p1382526的博客 287

H5 获取手机GPS坐标

只要手机有GPS模块,可以用HTML5的Geolocation接口获取 在HTML5中,geolocation作为navigator的一个属性出现,它本身是一个对象,拥有三个方法: getCurrentPosition watchPosition clearWatch 1.简单 function getLocation(){ if(navigator.geolocation){ //判断是否有这个对象 navigator.geoloc

达拉崩巴斑得贝迪卜多比鲁翁_ 4669

uniapp H5 图片压缩并且转blob

【代码】uniapp H5 图片压缩并且转blob。

love_weiai的博客 119

TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

Robot_PLC_HMI_Automation 8616

数学向量空间的对偶空间解析

对偶空间是线性代数的"进阶语法",它不仅深化了我们对向量空间的理解,还为解决实际问题提供了强大工具。用生活类比解释对偶空间的核心概念,打破"抽象数学"的壁垒;建立对偶空间与原向量空间的直观联系,揭示"对偶"的本质;通过数学推导和代码实现,让读者掌握对偶空间的基本运算;展示对偶空间在科学和工程中的应用,体现其理论价值。范围:本文从有限维实向量空间入手(便于理解),逐步扩展到对偶基、双对偶空间,最后简要提及无限维空间的特殊性。

AI天才研究院 880

HTML5实现图片压缩上传功能

http://blog.youkuaiyun.com/hj7jay/article/details/51003926

milijiangjun的博客 2129

大厂校招:星宸科技嵌入式面试及参考答案(5万字长文)

当一个新的硬件设备被插入系统时,内核会发送一个设备事件通知 udev,udev 会根据设备的属性和规则,为该设备创建一个合适的设备文件。通过去除不必要的驱动程序、禁用不需要的功能、选择合适的内核配置选项、优化内核编译选项和定制内核模块等方法,可以减小内核的大小和复杂性,提高系统的性能和稳定性。上半部通常是在中断关闭的情况下执行的,以确保中断处理的原子性。处理碎片化内存是内存管理中的一个重要问题,可以采用内存压缩、内存池管理、伙伴系统、首次适应算法和最佳适应算法等方法来减少内存碎片的产生,提高内存的利用率。

大模型大数据攻城狮的专栏 2929

《小白HTML5成长之路51》canvas压缩图片上传功能原理

"朱哥,昨天试了几把图片上传的功能,感觉还不错,不过有个小问题!"老朱:“什么问题?”小白:“小图片上传还好说,大图片上传的时候经常会卡顿一下。”老朱:“恩,很多人上传图片的时候都是直接上传原图的,很多相机照的原图大小都在4M左右,上传的图片如果都是这么大,不但用户觉得你的网站速度慢,还非常占服务器空间。”小白:“哦,确实是,很多人压根不知道自己上传的图片到底有多大。”老朱:“所以我们要让...

老炉传说的专栏 164

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

J I C vs 其他压缩工具:为什么它是前端开发者的最佳选择?

在现代网页开发中,图片加载速度直接影响用户体验和网站性能。J I C(Javascript Image Compressor)作为一款基于HTML5 Canvas和File API的前端图片压缩工具,通过100%客户端处理实现图片压缩,无需额外依赖,正成为前端开发者处理图片优化的理想选择。本文将深入对比J I C与其他压缩工具的核心差异,揭示其独特优势。 ## 🚀 核心优势:为什么J I C脱

gitblog_00861的博客 342

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

当我们在前端h5上传图片的时候

其实里面包含很多知识的,刚好昨天复习了这块,还是系统梳理一下吧,希望帮到刚接触的人。 注意,这篇文章针对的是IE10+的浏览器,想要兼容PC端IE9以下请使用jquery form插件。 --------------------开始 1.文件上传 不考虑旧浏览器的话,现在前端单纯上传文件的主流方式是创建FormData装载文件,POST上传: //html &lt;input type...

weixin_36094484的博客 1197

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

深入研究HTML5实现图片压缩上传

上篇文章中提到移动端上传图片,我们知道现在流量还是挺贵的,手机的像素是越来越高,拍个照动不动就是好几M,伤不起。虽然客户端可以轻轻松松实现图片压缩再上传,但是我们的应用还可能在浏览器里面打开,怎么办呢,图片压缩。受以前PC上的开发思维影响,尼玛js哪有权限去操作文件,哪有资格压缩图片啊,搞不了,你们客户端去整吧。只能说自己还是有些井底之蛙了。在HTML5的影响下,前端能干的事情越来越多了,开发的功...

abcde158308的博客 445
上一篇: 如何获得select被选中option的value和text和......
下一篇: php文件锁解决高并发
最强的法师
博客等级 码龄11年 16粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值