您的当前位置:首页正文

JS+Canvas做出图片预览压缩与上传

2023-11-30 来源:气吉美食网
这次给大家带来JS+Canvas做出图片预览压缩与上传,JS+Canvas做出图片预览压缩与上传的注意事项有哪些,下面就是实战案例,一起来看一下。

先来一张效果图,压压惊

第一步:用户选择需要上传的图片

<input type="file" accept="image/*" type="file"" name="imageFile" onchange="upload()">

在选定了图片后 upload 函数将被触发,我们需要在这个函数中,获取到图片的资源,将它压缩并利用canvas绘制出来,若需要上传到服务器,也可以利用ajax或者其他方式上传。

第二步:获取图片资源压缩预览上传

function upload() { let file = document.querySelector('input[type=file]').files[0] // 获取选择的文件,这里是图片类型 let reader = new FileReader() reader.readAsDataURL(file) //读取文件并将文件以URL的形式保存在resulr属性中 base64格式 reader.onload = function(e) { // 文件读取完成时触发 let result = e.target.result // base64格式图片地址 var image = new Image() image.src = result // 设置image的地址为base64的地址 image.onload = function(){ var canvas = document.querySelector("#canvas"); var context = canvas.getContext("2d"); canvas.width = image.width; // 设置canvas的画布宽度为图片宽度 canvas.height = image.height; context.drawImage(image, 0, 0, image.width, image.height) // 在canvas上绘制图片 let dataUrl = canvas.toDataURL('image/jpeg', 0.92) // 0.92为压缩比,可根据需要设置,设置过小会影响图片质量 // dataUrl 为压缩后的图片资源,可将其上传到服务器 } } }

现在我们来比较一下图片是否成功压缩:

原图大小:

压缩比设置为0.92:

压缩比设置为0.52

乍一看,你是不是觉得很奇怪,为什么设置了缩放比为0.92,图片居然比原图大?其实图片通过base64编码后都会变的比原图大,具体原因可以查阅base64的编码原理。如此看来,我们已经成功压缩了图片!

注意点:canvas在IE9以下不支持;大图片尽量不要使用base64,影响响应速度。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

怎样搭建vue2.0+boostrap项目

怎么解决Angular5升级RxJS到5.5.3报错问题

小编还为您整理了以下内容,可能对您也有帮助:

如何实现JS中图片压缩方法

本文主要介绍JS中图片压缩的方法,包括等比压缩图片的方法,需要的朋友可以参考下,希望能帮助到大家。

大多时候我们需要将一个File对象压缩之后再变为File对象传入到远程图片服务器;有时候我们也需要将一个base64字符串压缩之后再变为base64字符串传入到远程数据库;有时候后它还有可能是一块canvas画布,或者是一个Image对象,或者直接就是一个图片的url地址,我们需要将它们压缩上传到远程;面对这么多的需求,索性画了一张图:

Alt text

二、解决办法

如上图所示,王二一共写了七个方法,基本覆盖了JS中大部分文件类型的转换与压缩,其中:

1、 urltoImage(url,fn) 会通过一个url加载所需要的图片对象,其中 url 参数传入图片的 url , fn 为回调方法,包含一个Image对象的参数,代码如下:

2、 imagetoCanvas(image) 会将一个 Image 对象转变为一个 Canvas 类型对象,其中 image 参数传入一个Image对象,代码如下:

3、 canvasResizetoFile(canvas,quality,fn) 会将一个 Canvas 对象压缩转变为一个 Blob 类型对象;其中 canvas 参数传入一个 Canvas 对象; quality 参数传入一个0-1的 number 类型,表示图片压缩质量; fn 为回调方法,包含一个 Blob 对象的参数;代码如下:

这里的 Blob 对象表示不可变的类似文件对象的原始数据。 Blob 表示不一定是 JavaScript 原生形式的数据。 File 接口基于 Blob ,继承了 Blob 的功能并将其扩展使其支持用户系统上的文件。我们可以把它当做File类型对待,其他更具体的用法可以参考MDN文档

4、 canvasResizetoDataURL(canvas,quality) 会将一个 Canvas 对象压缩转变为一个 dataURL 字符串,其中 canvas 参数传入一个 Canvas 对象; quality 参数传入一个0-1的 number 类型,表示图片压缩质量;代码如下:

其中的 toDataURL API可以参考MDN文档

5、 filetoDataURL(file,fn) 会将 File ( Blob )类型文件转变为 dataURL 字符串,其中 file 参数传入一个 File ( Blob )类型文件; fn 为回调方法,包含一个 dataURL 字符串的参数;代码如下:

6、 dataURLtoImage(dataurl,fn) 会将一串 dataURL 字符串转变为 Image 类型文件,其中 dataurl 参数传入一个 dataURL 字符串, fn 为回调方法,包含一个 Image 类型文件的参数,代码如下:

7、 dataURLtoFile(dataurl) 会将一串 dataURL 字符串转变为 Blob 类型对象,其中 dataurl 参数传入一个 dataURL 字符串,代码如下:

三、进一步封装

对于常用的将一个 File 对象压缩之后再变为 File 对象,我们可以将上面的方法再封装一下,参考如下代码:

其中, file 参数传入一个 File ( Blob )类型文件; quality 参数传入一个 0-1 的 number 类型,表示图片压缩质量; fn 为回调方法,包含一个 Blob 类型文件的参数。

它使用起来就像下面这样:

这样的话,图片压缩上传就能轻松地搞定了,以上的8个方法我已经封装好放到 github 上了,喜欢的话可以使劲的star哈。

参考文档:

MDN

ps:下面看下JS等比压缩图片的办法

如何用js将canvas图像上传到服务器

<form id="form1" runat="server">

<div align="center" class="i-canvas">

<canvas id="myCanvas" width="500" height="300"></canvas>

<ul>

<li><button onclick="javascript:DrawPic();return false;">开始画图</button></li>

<li><button onclick="javascript:UploadPic();return false;">上传到服务器</button></li>

</ul>

</div>

</form>

js压缩图片清晰度不变-如何压缩图片保持清晰度

js压缩图片到固定像素以内,500k为例

本文旨在探究js压缩图片的两种方式:

改变图片长宽

,

改变图片质量

,和结合了以上两者的

最终方案

首先,阅读本文需要知道canvas的两个方法

这两个方法具体的说明可以在MDN上查看,关于图片压缩,也有很多现成的博客可以直接用。但是那些博客都有个问题,并没有关心之后图片的压缩质量。

我试着用一个现成的例子去跑了一下,一个1.7M的图片压缩到了23k,堪称像素级毁灭性破坏。

假如一张大图可能包含着很多文字等关键信息,必须上传之后使用方能清晰辨认。所以要压缩之后质量尽可能接近500k的。500k像素以内,就是若一张图宽度为1024,则高度不能超过500。因为图片有其他的信息,也是要占大小的。即不得大于

1024*500

所以,根据需求,上传图片不能超过500k的情况下尽可能保留图片的清晰度。当然如果可以的情况下用上面提到的设置压缩程度为0.9,0.8试试看,图片质量可以接受,大小会有大幅度的缩小。

如果不压缩,靠调整图片长宽去控制上传大小呢?

原理很简单,就是靠不断地缩小限定的最大宽高,直到最终长宽的积小于规定的大小。

这种方法有可能最后得出的图片的大小会略大于规定大小,原因上文也提到过了,如果想使用这种方法,可自行再调整一下。

上面的方法有个问题,就是改变了图片的原始长宽。如果一个图的长宽足够大,压缩图片质量,糊一点但是内容看得清也是ok的嘛。所以,跟上面同理,我们可以不断调整图片的质量设定直到大小合适,那么,如何在图片上传之前知道图片的大小呢?

首先,需要知道的一点是,压缩之后拿到的base64字符串会转成blob对象,然后传给服务端。

可以查阅文档,blob对象有个属性是size

这个size就是上传之后实际的文件大小。

参照上面的思路,可以每次改变('image/'+fileType,level);level的值,去调整压缩图片质量,然后用blob对象的size去验证是否满足500k以内的需求。

关于的level到底是怎么计算的,MDN文档里也没说,写了个循环一次减少0.1的level压缩了几个图片

用加减乘除算了一下,没找到规律,数学不好放弃了(这个东西好像也不是能观察出来的,看结果跟初始大小没啥关系)。

这里要注意的是,有可能遇到超大图片,0.1的level可能不足以压缩到500k,所以小于0.1的时候,改变level递减的差值继续压缩下去

在开始接收到图片的时候给一个loading增加用户的耐心好了,loading万岁~

其实单纯的压缩质量遇到稍大的图片,会导致页面高频计算,然后页面基本就用不了了--。有尝试过用iphone的一个屏幕截图(10M左右),压的时候稍过一会,整个手机都在发烫,只能杀进程。

所以,若对长度没有特殊的,可以做一个缩放,去加快压缩的进度,提高能压缩的图片大小上限。

页面到了ios上还是不行--,可以看到最后图片level为0.001,最长边为764。

问题还是循环次数还是过多,计算频率太高。从图中可看出,对于大图来说,初始设定的level和图片尺寸过于宽松,可以优化一下初始level和尺寸。

有的时候还会遇到一张图片无论如何也压不到500k,就是上一次和这次的压缩后大小没有变化,这种情况需要抛错,不让循环继续。

大图片的等待时间稍长,可以给用户先预览一个base64的图片增加等待耐心,方法名为getImgBase64,这里都一并给出了

解决的隐患:上面这个方案会出现我需要一个500k的照片,压到了520k之后,再压了一次。有时候这最后的一次会特别夸张,直接将图片弄到了几十k。

参考了:

这个库里面有个方法compressAccurately,这个方法可以比较精准地压缩。偷偷翻了一下源码。

其实上一个方案的痛点就在于,如何在每一个压缩循环里处理尺寸和压缩比例。

总结

如有纰漏,欢迎指正

怎么把图片压缩的小一点,质量还要保持不变

照片文件需要压缩变小,但是图片画面清晰质量不变,可以使用以下操作方法:

1、获取工具“

秒会压缩大师

”,选择操作

2、导入照片进行操作。

3、最后等待图片压缩完成。

4、说明压缩模式:

缩小优先(适合用于个人资料图片和缩率图)

均衡压缩(适合用于

电子邮件

和消息发送)

清晰优先(适合查看)

推荐理由:

1.__J窖顾跬计:可根据需求选择图片压缩模式(如缩小优先、清晰优先),并支持自定义设图片压缩的清晰度、分辨率、格式以及希望大小。

2._.操作简单快速:可一次性上传多张需要压缩的图片文件,批量进行图片压缩处理,支持根据压缩前与压缩后的文件大小对比确认压缩结果是否符合预期效果,节约图片压缩的时间成本。

3.__U衔募踩:图片压缩在线版对压缩过程进行了多重加密处理,并且在压缩完图片文件的30分钟后,便会将所有文件从服务器中永久删除,期间无人能查阅或下载这些文件,让你的文件与隐私得到保障。

支持多种格式:图片:支持JPG、PNG、GIF、BMP等图片格式;视频:支持MP4、MKV、MOV、AVI、WMV、M4V、MPEG等

视频格式

;PDF:PDF文档均可压缩;Word:支持doc、docx等Word格式;PPT:支持ppt、pptx等PPT格式;

如何压缩图片保持清晰度

1、可以使用压缩软件在确保清晰度的同时压缩图像。打开压缩软件,你会发现页面压缩,视频压缩和PDF压缩功能,点击选择图像压缩。

2、然后进入操作界面。添加需要压缩的图像。您可以单击“添加文件”或“添加文件夹”按钮一次上载多个图像。当然,您也可以将图像直接拖放到操作界面中。

3、添加文件后,您可以选择压缩文件的压缩选项。在添加的文件下方,有一个减少优先级,正常压缩和明确优先级。该软件将默认为正常压缩。我们需要保持图像的清晰度。

4、选择保存的路径后,压缩的图像文件可以保存在原始文件夹中,也可以自定义保存的位置。压缩成功后查看文件时可以找到它。

5、最后,单击按钮开始压缩,即可实现图像文件的压缩。

6、等待压缩完成后,您可以查看刚刚成功压缩的文件。如果要快速查看文件,可以单击按钮在页面上查看文件,然后单击以查看文件。

7、当然,压缩成功后,页面还会显示压缩后的文件大小,可以与压缩前的文件大小进行比较。我们可以清楚地看到图像压缩更小。

气吉美食网还为您提供以下相关内容希望对您有帮助:

js压缩图片清晰度不变-如何压缩图片保持清晰度

1.__J窖顾跬计:可根据需求选择图片压缩模式(如缩小优先、清晰优先),并支持自定义设图片压缩的清晰度、分辨率、格式以及希望大小。2._.操作简单快速:可一次性上传多张需要压缩的图片文件,批量进行图片压缩处理,支持根据压缩...

如何实现JS中图片压缩方法

或者直接就是一个图片的url地址,我们需要将它们压缩上传到远程;面对这么多的需求,索性画了一张图:Alt text二、解决办法如上图所示,王二一共写了七个方法,基本覆盖了JS中大部分文件类型的转换与压缩,其中:1、 urlto...

如何用js将canvas图像上传到服务器

&lt;li&gt;&lt;button onclick="javascript:DrawPic();return false;"&gt;开始画图&lt;/button&gt;&lt;/li&gt; &lt;li&gt;&lt;button onclick="javascript:UploadPic();return false;"&gt;上传到服务器&lt;/button&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/form&gt; ...

js base64与canvas base64

获取到上传的文件myfile,创建一个fileRead文件对象,使用readAsDataURL方法可以将读取到的文件编码成Data URL。文件加载成功后,e.target.result就是文件图片所对应的base64编码。直接赋值给img的src,就能显示图片。下面是onload...

图片拍照上传解决方案

兼容性 张鑫旭的文章: HTML5 file API加canvas实现图片前端JS压缩并上传 张鑫旭的文章: 理解DOMString、Document、FormData、Blob、File、ArrayBuffer数据类型 使用Camera API 张鑫旭 ...

canvas怎么导入word

1.通用的canvas转化图片下载是没有后缀名的,这个可以有; 2.因为canvas是页面加载之后才导出,这样图像就不能导出到word,资源中先把canvas生成的图片放到img中,在隐藏canvas,然后再导出,okhtml-docx-js, 在浏览器中,将HTML文档转换为 ...

上传图片时文件过大怎么办?

一、打开photoshop软件界面,点击左上角的文件选择打开按钮。二、在弹出的对话框中,选择需要调整大小的图片,然后点击打开按钮。三、打开该图片后,点击左上角的文件选择存储为按钮。四、在出现的保存对话框中选择图片格式为...

拍照或从文件夹里上传图片(重复上传同一张图片失效的解决办法)

//旋转照片, 利用exif.js解决ios手机上传竖拍照片旋转90度问题 rotateImg(img, direction, canvas) { //最小与最大旋转方向,图片旋转4次后回到原方向 const min_step = 0;const max_step = 3;if(img == null)...

手机为什么截屏总是模糊的呢?

html2canvas是一种基于canvas,将DOM结构绘制在canvas上面产生图片的第三方库。通过如下的方式可以将对应的DOM结构绘制成图片保存出来。优势在于上手简单,使用方便。绘制原理 原理如下图所示。核心逻辑是克隆对应节点DOM结构,利用...

...之后提交给后台. HTML5,PHP,Javascript,canvas

缺点你无法直接验证传来的base64数据的完整性,比如大小,文件头之类的,还需要自己来实现。

显示全文

猜你还关注