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的博客 367

避坑指南:群晖DSM 7.X挂载NTFS硬盘,为什么你的SATA口不行?从原理到实战一次讲清

本文深入解析群晖DSM 7.X系统挂载NTFS硬盘的底层原理与实战排查方法,揭示SATA接口权限配置的关键参数(如esataportcfg和internalportcfg),并提供安全修改端口配置的详细步骤。针对不同型号群晖NAS的配置差异,给出替代方案与常见故障排查技巧,帮助用户解决NTFS硬盘挂载问题。

weixin_26757925的博客 257

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

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

一捆铁树枝的博客 3988

补洞与fairing算法

对网格进行补洞,remesh, 平滑,fairing, 最小二乘优化平滑

闪电彬彬的博客 1047

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

统信UOS开发环境支持Java

集成了JDK和多种IDE,为开发者提供了从代码编写、编译、调试到部署的一站式开发解决方案。

RZer的博客 2256

计算机组成与系统结构(第三版) 袁春风主编 课后习题答案讲解 第一、二章 计算机系统概述 数据的机器级表示

计算机组成与系统结构(第三版) 袁春风主编 课后习题答案讲解 第一、二章 计算机系统概述 数据的机器级表示

qq_73523062的博客 2093

canvas进行图片压缩

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

p1382526的博客 287

YOLOv5 改进点总览:轻量化、高精度的背后有哪些魔改?

YOLOv5是由Ultralytics团队开发的高效目标检测模型,其核心改进包括:主干网络采用CSPDarknet53提升梯度传播效率;特征融合使用PANet增强小目标识别;输出结构采用解耦头设计优化定位和分类任务。此外,YOLOv5通过CIoU损失函数、Mosaic数据增强和SimOTA标签分配机制进一步提升性能。模型支持多种推理格式(ONNX/TensorRT等),并具备自动锚框匹配和多尺度训练功能,使其在轻量化(yolov5s仅7MB)与高性能(最高51.2% mAP)间取得平衡,但缺乏正式论文支撑是

guoguozgw的博客 1806

uniapp H5 图片压缩并且转blob

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

love_weiai的博客 119

从零到一:用ROS2和Gazebo搭建Franka机械臂仿真环境(避坑指南)

本文详细介绍了如何使用ROS2和Gazebo从零开始搭建Franka机械臂的仿真环境,包括环境准备、ROS2包安装、控制器配置及常见问题解决方案。特别针对关节位置控制等核心功能提供了实用代码示例和避坑指南,帮助开发者高效构建机器人算法验证平台。

weixin_29061465的博客 460

基于Qt的工业组态软件开发:图形绘制与TCP通讯实现

在数据接收时,通过 readyRead 信号触发解析函数,校验数据包完整性后提取有效数据,并更新对应图形元素的状态,例如根据温度值改变矩形的填充色,实现设备状态可视化。测试阶段,我们将软件部署到Windows工控机,连接PLC设备进行通讯测试,结果表明图形元素响应及时,TCP数据传输稳定,满足工业现场的基本需求。综上所述,基于Qt的组态软件开发,核心在于利用 QGraphicsView 框架实现图形元素的灵活绘制与管理,结合 QTcpSocket 完成工业数据的可靠交互。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 273

HTML5实现图片压缩上传功能

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

milijiangjun的博客 2129

【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能

在探讨计算机性能优化的旅程中,我们常常被引导去关注算法的复杂度、代码的优化,或是更高效的数据结构。然而,有一个经常被忽视的角色在幕后默默地影响着程序的运行效率——那就是缓存(Cache)。正如哲学家亨利·戴维·梭罗在《瓦尔登湖》中所说:“细节是造成美丽的源泉”,在软件开发的世界里,对缓存的理解和优化,就是那些决定程序性能优雅与否的细节。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3736

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

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

老炉传说的专栏 164

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

gitblog_00861的博客 342

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

weixin_36094484的博客 1197

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深入研究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、付费专栏及课程。

余额充值