”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 在 Next.js 项目中通过裁剪和压缩优化图像上传

在 Next.js 项目中通过裁剪和压缩优化图像上传

发布于2024-11-08
浏览:333

Optimizing Image Upload with Cropping and Compression in Next.js Projects

作为前端开发人员,您很有可能曾经或正在从事涉及发布和显示图像的项目。如果你还没有,那么你很快就会的。因此,最近,在我们完成项目后,我们发现在显示用户提供的图像时遇到了麻烦。

这一切是如何解开的
最大的问题是如何处理尺寸,尤其是图像的高度与宽度。将图像设置为 object-fit: cover 似乎是填充图像容器的完美解决方案。但这又带来了其他问题。用户上传不同尺寸的图像;有些正在缩放,有些正在裁剪到同一个容器中。这种不一致的结果是 UI 不那么吸引人,尤其是当用户的个人资料图片以不太明显的方式裁剪时。

解决方案
我决定寻找更好的解决方案。模仿社交媒体平台处理图像上传的方式,我认为让用户能够在上传之前裁剪和预览图像是件好事。经过一番研究,我终于找到了react-image-crop包。该软件包为用户提供了实时裁剪图像的能力,从而解决了部分问题。

在测试裁剪功能时,我注意到我正在处理的图像大小为 9.5MB。这时我突然想到:为什么不在客户端先压缩图片再上传呢?即使后端也处理这个问题,提前优化图像的能力可以节省带宽并缩短上传时间。

这让我找到了另一个方便的包:浏览器图像压缩。将其与react-image-crop合并使我现在可以即时裁剪和压缩图像,并且效果很好。

权衡
该解决方案并非没有一些权衡。首先,您必须向项目中添加两个包;此外,由于压缩开销,小于 30KB 的图像实际上最终会变得更大。

我还使用Shadcn UI组件和react-dropzone包对其进行样式设计,以便让用户单击选择或拖放他们的图像。

使用 Next.js 图像组件
为了获得更好的性能,该解决方案可以与 Next.js Image 组件结合使用,该组件会自动优化图像。 Next.js 图像组件有助于提供适当大小的图像,从而缩短加载时间并提高整体性能。通过将裁剪和压缩与 Next.js 图像优化的强大功能相结合,您可以为用户提供更流畅、更高效的体验。

演示和源代码
您还可以在这里尝试现场演示

这里还有源代码 GitHub 存储库。觉得有用请star!如果您考虑在项目中使用此解决方案,请告诉我。

版本声明 本文转载于:https://dev.to/evansrobbie/optimizing-image-upload-with-cropping-and-compression-in-nextjs-projects-72a?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    编程 发布于2025-04-18
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-04-18
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示 仅通过Python的MlStripper 来简化剥离过程,Python Standard库提供了一个专门的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    编程 发布于2025-04-18
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-04-18
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-04-18
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-04-18
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-04-18
  • PHP入门指南:初学者必读
    PHP入门指南:初学者必读
    此摘录摘自 php&mysql:新手到忍者,第七版引入了基本的php概念。 我们将介绍PHP的服务器端性质,基本语法,变量,运算符,注释和控制结构。 [2 与客户端语言(HTML,CSS,JavaScript)不同,浏览器执行的是,PHP在将页面发送到浏览器之前,在?> 。PHP标记中,由服务器处...
    编程 发布于2025-04-18
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-04-18
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-04-18
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-04-18
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-04-18
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-04-18
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-04-18
  • JavaScript中如何动态访问全局变量?
    JavaScript中如何动态访问全局变量?
    在JavaScript 一种方法是使用窗口对象存储和检索变量。通过引用全局范围,可以使用其名称动态访问变量。 //一个脚本 var somevarname_10 = 20; //另一个脚本 window.all_vars = {}; window.all_vars ['somevarnam...
    编程 发布于2025-04-18

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3