节省了时间 - 在浏览器中处理大图像" />
客户上传了 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); }; <h3> 结果 </h3> <p>改善是立竿见影的!浏览器不仅可以毫无问题地处理 28 张大图像,而且我们还通过加载<strong>120 MB 图像</strong>测量<strong>28,000 x 17,000 像素</strong>进一步推动它,并且它仍然可以正常工作是一个小图标。</p> <h3> 差异在哪里? </h3> <p>使用元素,绘图完全掌握在 GPU 手中,而这些芯片实际上就是为此任务而制造的。</p> <ul> <li> <img alt=" 如何扭转局面 - 在浏览器中处理大图像" >;仍尝试渲染 28,000 * 17,000 = 476,000,000 像素。</li> <li>这个仅绘制 80 * 80 = 6,400 像素。</li> </ul> <p>通过调整 <canvas> 中的图像大小到较小的预览尺寸,我们大大减少了浏览器需要处理的数据量 - 将数亿像素发送到 GPU 并返回数千个像素,这很大,对吧?</canvas></p> <h2> 下一步 </h2> <p>鉴于这一成功,我们现在正在考虑替换 <img alt=" 如何扭转局面 - 在浏览器中处理大图像" >与 在我们应用程序的其他部分,特别是在一次显示大约 250 张图像的管理屏幕中。虽然这些图像已经正确调整了大小,但我们很好奇是否使用 <canvas>可以提供更好的性能。</canvas></p> <p>我们将进行测试和基准测试来衡量任何性能提升。我一定会在以后的文章中分享我们的发现。</p> <h2> 重要警告 </h2> <p>使用<canvas>时为我们的特定用例创造了奇迹,我必须注意,您<strong>不应该使用 <canvas>;用于在网站面向公众的部分显示图像</canvas></strong>。原因如下:</canvas></p> <ul> <li> <strong>辅助功能</strong>:<img alt=" 如何扭转局面 - 在浏览器中处理大图像" >;屏幕阅读器可以读取元素,为视障用户提供帮助。</li> <li> <strong>SEO</strong>:搜索引擎索引来自 <img alt=" 如何扭转局面 - 在浏览器中处理大图像" > 的图像标签,可以提高网站的可见性。 (同样,人工智能训练抓取工具也会对图像进行“索引”。好吧,你能做什么......)</li> <li> <img alt=" 如何扭转局面 - 在浏览器中处理大图像" >;与;可用于自动检测像素密度并显示更大或更小的图片以实现完美契合 - <canvas>不能。我写了一篇关于如何构建您的 .</canvas> </li> </ul> <p>对于公共网站,最好在将图像提供给用户之前在服务器端正确调整图像大小。如果您对如何自动调整图像大小和优化感兴趣,我写了一篇关于该主题的文章,您可能会觉得有用。</p> <h2> 结论 </h2> <p><strong>我喜欢优化!</strong>尽管我们每天都在向本地高性能硬件迈进,但通过优化 - 即使“它很好,但还可以更好” - 我们可以防止出现此类问题开始。</p> <p>这种方法不是标准的。而且我不太关心标准。它们通常被视为硬性规则,但它们只是指导方针。这个解决方案很合适。我们没有客户拥有没有坚实的的古老设备。支持。所以,即使现在我们有更多的代码需要管理,有多种显示图片的方式,但它非常适合,这才是重要的!</p> <p><strong>你有类似的经历吗?你是怎么处理的?欢迎在下面的评论中分享您的经验或提出问题!</strong></p> </div>
以上是 如何扭转局面 - 在浏览器中处理大图像的详细内容。更多信息请关注PHP中文网其他相关文章!

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver CS6
视觉化网页开发工具