当前位置: 首页 > 面试题库 >

如何在浏览器中通过Javascript压缩图像?

姚建树
2023-03-14
问题内容

TL; DR;

上传之前,有没有一种方法可以直接在浏览器端压缩图像(主要是jpeg,png和gif)?我很确定JavaScript可以做到这一点,但是我找不到实现它的方法。

这是我要实现的完整方案:

  • 用户访问我的网站,然后通过input type="file"元素选择图片,
  • 该图片是通过JavaScript检索的,我们进行了一些验证,例如正确的文件格式,最大文件大小等,
  • 如果一切正常,则会在页面上显示图像的预览,
  • 用户可以执行一些基本操作,例如将图像旋转90°/ -90°,按照预定义的比例进行裁剪等,或者用户可以上传其他图像并返回步骤1,
  • 当用户满意时,然后将编辑的图像压缩并本地“保存”(不保存到文件中,而是保存在浏览器的内存/页面中),-
  • 用户使用姓名,年龄等数据填写表单,
  • 用户单击“完成”按钮,然后将包含数据和压缩图像的表单发送到服务器(不使用AJAX),

直到最后一步的整个过程都应该在客户端完成,并且应该与最新的Chrome和Firefox,Safari 5+和 IE 8+
兼容。如果可能的话,应该只使用JavaScript(但是我很确定这是不可能的)。

我现在还没有编写任何代码,但是我已经考虑过了。可以通过FileAPI在本地读取文件,可以使用Canvas元素进行图像预览和编辑,但是
我找不到找到图像压缩部分的方法

根据html5please.com和caniuse.com的说法,要支持这些浏览器非常困难(由于IE),但是可以使用诸如FlashCanvas和FileReader之类的polyfill来实现。

实际上,目标是减小文件大小,因此我认为图像压缩是一种解决方案。但是,我知道上载的图像将每次都在同一位置显示在我的网站上,并且我知道该显示区域的尺寸(例如200x400)。因此,我可以调整图像大小以适合这些尺寸,从而减小文件大小。我不知道这种技术的压缩率是多少。

你怎么看 ?您有什么建议要告诉我吗?您知道在JavaScript中压缩图像浏览器端的任何html" target="_blank">方法吗?感谢您的答复。


问题答案:

简而言之:

  • 使用HTML5 FileReader API和.readAsArrayBuffer读取文件
  • 使用文件数据创建一个Blob,然后使用window.URL.createObjectURL(blob)获取其url。
  • 创建新的Image元素并将其src设置为文件blob url
  • 将图像发送到画布。画布尺寸设置为所需的输出尺寸
  • 通过canvas.toDataURL(“ image / jpeg”,0.7)从画布获取按比例缩小的数据(设置您自己的输出格式和质量)
  • 将新的隐藏输入附加到原始表单,并基本上以普通文本的形式传输dataURI图像
  • 在后端,读取dataURI,从Base64解码并保存


 类似资料:
  • 我用C#在屏幕外生成一堆SSRS报告,然后把每个报告的图像粘贴到一个PowerPoint演示文稿中,有效地将所有报告整理成一个包。虽然这样做很好,但对于一个26页的演示文稿,它的文件大小只有23mb。(我明白,使用高dpi在一定程度上导致了这个巨大的数字,但事实证明,这是创建所需清晰度的图像所必需的)。 但是,当我将此演示文稿手动保存在PowerPoint中时,文件大小会减小到大约13mb。(这是

  • 问题内容: 我需要javascript来检测每个浏览器换行的文本并将其换成。 我碰到过很多文章,都在讨论如何测量每个单词的y轴,但还没有一个可靠的解决方案。 到目前为止,这就是我所拥有的。在Jsfiddle上看到它。 HTML JS / jQuery CSS ​ 问题答案: 首先我必须承认,我认为这将是一项艰巨的任务,因为无法通过任务浏览器告诉您自动换行符发生在何处。 我创建了一个解决方案,首先将

  • 我集成了。视频压缩工作正常,但除了safari浏览器外,其他浏览器不播放视频。上传到服务器后。我使用了以下命令。 请帮帮我。先谢谢你。

  • 问题内容: 我正在使用此示例中的代码从发送一个到我的Web服务器。在这里复制代码 我的问题 如何在将其发送到服务器之前对其进行最佳压缩,以及如何在服务器(我正在使用)上对其进行解压缩? 问题答案: 根据此http://android-developers.blogspot.com/2011/09/androids-http- clients.html 如果您使用的是Gingerbread或更高版本

  • 问题内容: 当用户更改页面缩放时,是否可以使用JavaScript检测?我只是想捕获一个“缩放”事件并对其进行响应(类似于window.onresize事件)。 谢谢。 问题答案: 无法主动检测是否有变焦。我在这里找到了如何尝试实现它的好方法。 我发现了两种检测缩放级别的方法。检测缩放级别变化的一种方法取决于不缩放百分比值的事实。百分比值是相对于视口宽度的,因此不受页面缩放的影响。如果您插入两个元

  • 问题内容: 我一直很难完成必须完成的一项非常正常的任务。我将图像上传并保存到Web服务器,并将该文件的路径保存在MySQL数据库中(这一切正常)。不起作用的是从服务器获取图像文件,并通过ajax在页面上显示它。 最初,我只是尝试从数据库中检索路径,并使用图像的路径更新标签的属性。这是可行的,但是所有映像都位于服务器上的文件夹中,所有人都可以访问它们。不是很好。我只能让这些用户访问属于某些用户的图片