如何扭转局面 - 在浏览器中处理大图像
节省了时间 - 在浏览器中处理大图像" />
客户上传了 28 张图像,每张大约 5800 x 9500 像素 和 28 MB 大小。当尝试在浏览器中显示这些图像时,整个选项卡冻结了 - 甚至拒绝关闭 - 长达 10 分钟。这是在配备 Ryzen 9 CPU 和 RTX 4080 GPU 的高端机器上进行的,而不是小型笔记本电脑。
情况如下
在我们的 CMS (Grace Web) 中,当管理员上传文件(无论是图片还是视频)时,我们会在上传完成后立即显示它。这对于用户体验来说非常好 - 它确认上传成功,他们上传了他们想要的内容,并且它显示了 UI 的响应能力以获得更好的感觉。
但是这些巨大的图像,浏览器几乎无法显示它们并冻结了。
需要注意的是,问题不在于上传本身,而在于显示这些大图像。同时一张一张地渲染 28 张巨大的图像实在是太多了。即使在空白页上,也只是...不。
为什么会发生这种情况(深入探讨)?
任何时候您在 中显示图片时在图像加载和布局重新计算期间,浏览器会经历一个使用 CPU、RAM、GPU(有时甚至是驱动器)的整个过程,有时甚至会在显示图片之前多次循环执行此过程。它经历了计算像素、在硬件之间传输数据、插值算法等。对于浏览器来说,这是一个重要的过程。
集思广益的解决方案
我们考虑了几种选择:
-
上传后立即调整大小并显示缩略图
- 问题:调整大小可能需要太长时间,并且不能保证立即完成,特别是在调整大小队列不为空的情况下 - 导致系统不响应。
-
检查文件大小并仅显示大文件的名称
- 问题:这会降低用户体验,特别是对于那些需要对任何媒体材料进行更好控制和检查的用户(顺便说一句,这些材料通常是具有大文件的相同材料)。
这些解决方案都感觉不可用。我们不想限制管理员上传所需内容的能力,也不想在用户体验上做出妥协。
灯泡!使用
我记得
测试理论
我们决定替换 带有
const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const img = new Image(); // img.src = URL.createObjectURL(file); // Use this if you're working with uploaded files img.src = filesroot + data.file_path; // Our existing file path img.onload = function() { // Resize canvas to desired size (for preview) canvas.width = 80 * (img.width / img.height); // Adjust scaling as needed canvas.height = 80; // Draw the image onto the canvas, resizing it in the process ctx.drawImage(img, 0, 0, canvas.width, canvas.height); file_div.innerHTML = ''; // Prepared <div> in UI to display the thumbnail file_div.appendChild(canvas); };
结果
改善是立竿见影的!浏览器不仅可以毫无问题地处理 28 张大图像,而且我们还通过加载120 MB 图像测量28,000 x 17,000 像素进一步推动它,并且它仍然可以正常工作是一个小图标。
差异在哪里?
使用元素,绘图完全掌握在 GPU 手中,而这些芯片实际上就是为此任务而制造的。
-
;仍尝试渲染 28,000 * 17,000 = 476,000,000 像素。
- 这个<画布>仅绘制 80 * 80 = 6,400 像素。
通过调整
下一步
鉴于这一成功,我们现在正在考虑替换 与 在我们应用程序的其他部分,特别是在一次显示大约 250 张图像的管理屏幕中。虽然这些图像已经正确调整了大小,但我们很好奇是否使用
我们将进行测试和基准测试来衡量任何性能提升。我一定会在以后的文章中分享我们的发现。
重要警告
使用
-
辅助功能:
;屏幕阅读器可以读取元素,为视障用户提供帮助。
-
SEO:搜索引擎索引来自
的图像标签,可以提高网站的可见性。 (同样,人工智能训练抓取工具也会对图像进行“索引”。好吧,你能做什么......)
-
;与;可用于自动检测像素密度并显示更大或更小的图片以实现完美契合 -
不能。我写了一篇关于如何构建您的 .
对于公共网站,最好在将图像提供给用户之前在服务器端正确调整图像大小。如果您对如何自动调整图像大小和优化感兴趣,我写了一篇关于该主题的文章,您可能会觉得有用。
结论
我喜欢优化!尽管我们每天都在向本地高性能硬件迈进,但通过优化 - 即使“它很好,但还可以更好” - 我们可以防止出现此类问题开始。
这种方法不是标准的。而且我不太关心标准。它们通常被视为硬性规则,但它们只是指导方针。这个解决方案很合适。我们没有客户拥有没有坚实的<画布>的古老设备。支持。所以,即使现在我们有更多的代码需要管理,有多种显示图片的方式,但它非常适合,这才是重要的!
你有类似的经历吗?你是怎么处理的?欢迎在下面的评论中分享您的经验或提出问题!
以上是 如何扭转局面 - 在浏览器中处理大图像的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。
