首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,590 阅读
2
Mac打印机设置黑白打印
4,903 阅读
3
修改elementUI中el-table树形结构图标
4,873 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,654 阅读
5
intelliJ Idea 2022.2.X破解
4,333 阅读
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Vue
Spring Cloud
Mac
MyBatis
WordPress
MacOS
asp.net
Element UI
Nacos
.Net
Spring Cloud Alibaba
MySQL
Mybatis-Plus
Typecho
jQuery
Java Script
微信小程序
Oracle
Laughing
累计撰写
618
篇文章
累计收到
1,419
条评论
首页
栏目
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
2
篇与
的结果
2024-07-04
使用thumbnailator实现图片压缩
Thumbnailator是一个用于Java的强大的图片处理库,主要用于创建、缩放和裁剪图片的缩略图。它设计得既简单又功能强大,提供了一系列丰富的特性:尺寸调整:Thumbnailator能够根据指定的宽度或高度来调整图片大小。裁剪:可以将图片裁剪为特定的尺寸或长宽比。水印添加:可以在图片上添加文本或图片形式的水印。格式支持:支持多种图像格式,如JPEG、PNG、BMP、GIF等。Thumbnailator的使用非常直观。你只需要在你的项目中添加Thumbnailator的依赖(比如在Maven或Gradle的构建文件中),然后就可以在代码中调用其提供的方法了。下面结合项目示例,介绍一下使用Thumbnailator的方法,当然,关于添加水印、裁剪等功能你可以查看其github仓库https://github.com/coobird/thumbnailator壹、添加依赖我这里使用的0.4.20版本。 <!--thumbnailator图片处理--> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.20</version> </dependency>贰、创建一个公共类这里简单介绍一下,getAccuracy是根据原图片大小,判断压缩的比例,压缩比例介于[0,1],比例越小,压缩的越小,当然相应的图片就会越模糊,所以这个比例可以根据实际情况进行调整,尽量保证压缩比例小的情况下,别造成图片失真。compressPicForScale方法,第一个参数代表源图片字节数组,第二个参数desFileSize代表要压缩到的大小,单位是kb,compressPicForScale方法对输入的图片循环压缩,直至压缩后文件大小<= desFileSizepackage cc.lisen.common.utils.file; import net.coobird.thumbnailator.Thumbnails; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; /** * description: 图片压缩 * * @author: leeframe * DateTime: 2024-07-04 11:54 */ public class PicUtils { //以下是常量 private static final Logger logger = LoggerFactory.getLogger(PicUtils.class); private static final Integer ZERO = 0; private static final Integer ONE_ZERO_TWO_FOUR = 1024; private static final Integer NINE_ZERO_ZERO = 900; private static final Integer THREE_TWO_SEVEN_FIVE = 3275; private static final Integer TWO_ZERO_FOUR_SEVEN = 2047; private static final Double ZERO_EIGHT_FIVE = 0.85; private static final Double ZERO_SEVEN_FIVE = 0.75; private static final Double ZERO_FOUR_FOUR = 0.44; private static final Double ZERO_FOUR = 0.4; /** * 根据指定大小压缩图片 * * @param imageBytes 源图片字节数组 * @param desFileSize 指定图片大小,单位kb * @return 压缩质量后的图片字节数组 */ public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) { if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) { return imageBytes; } long srcSize = imageBytes.length; double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR); try { while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) { ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length); Thumbnails.of(inputStream) .scale(accuracy) .outputQuality(accuracy) .toOutputStream(outputStream); imageBytes = outputStream.toByteArray(); } logger.info("图片原大小={}kb | 压缩后大小={}kb", srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR); } catch (Exception e) { logger.error("【图片压缩】msg=图片压缩失败!", e); } return imageBytes; } /** * 自动调节精度(经验数值) * * @param size 源图片大小 * @return 图片压缩质量比 */ private static double getAccuracy(long size) { double accuracy; if (size < NINE_ZERO_ZERO) { accuracy = ZERO_EIGHT_FIVE; } else if (size < TWO_ZERO_FOUR_SEVEN) { accuracy = ZERO_SEVEN_FIVE; } else if (size < THREE_TWO_SEVEN_FIVE) { accuracy = ZERO_FOUR_FOUR; } else { accuracy = ZERO_FOUR; } return accuracy; } } 叁、使用我这里是借助阿里云OSS,然后下载的网络图片/** * 阿里云文件上传(中保创) * * @param extension 文件后缀 * @param ownerDirectory 目录 */ public String upload(String extension, String ownerDirectory, String url) throws InvalidExtensionException, IOException { // 填写网络流地址。 try (InputStream inputStream = new URL(url).openStream()) { // 校验格式、大小等 String filePath = getFilePath(extension, ownerDirectory); byte[] bytesOriginal = IOUtils.toByteArray(inputStream); byte[] bytes = PicUtils.compressPicForScale(bytesOriginal, 400); ByteArrayInputStream inputStreamCompress = new ByteArrayInputStream(bytes); // 上传到阿里云 ossClient.putObject(aliyunConfig.getBucketName(), filePath, inputStreamCompress); //this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保持数据库 return aliyunConfig.getUrlPrefix() + filePath; } }
2024年07月04日
910 阅读
0 评论
0 点赞
2024-03-26
阿里云OSS+CDN:一记组合拳,轻松降低您的建站成本
在数字化时代,拥有一个高效、稳定且成本优化的网站对于企业的线上业务至关重要。如果你遇到跟我类似的业务,需要上传大量图片的场景,可以参考一下我是如何降低费用的。在企业网站部署时,硬盘及带宽是相对比较费钱的地方,为了降低ECS带宽及硬盘费用,我们可以采用OSS的方案,前端将图片压缩后,存储到OSS中,但是即便如此,如果我们图片比较多的话,OSS的外网流出费用也是相对比较贵的,相对比而言,CDN的费用要相对便宜很多。为了尽可能的降低费用,我么可以采用阿里云对象存储服务(OSS)与内容分发网络(CDN)的组合运用的“降本增效”组合拳,降低建站成本,提升网站性能。本文将深入探讨如何借助阿里云OSS+CDN实现这一目标。壹、OSS:低成本、高可用的对象存储服务存储成本优化阿里云OSS作为一款大规模、安全可靠的云存储服务,其计费模式灵活,仅按实际使用量付费,无需预先投入高昂的硬件购置和运维成本。同时,OSS提供多种存储类型(如标准存储、低频访问存储、归档存储等),用户可根据数据访问频率和生命周期选择最经济的存储方案,进一步节省成本。高扩展性与可用性随着网站数据量的增长,OSS能够无缝扩展存储空间,无需担心容量瓶颈。其服务可用性高达99.999999999%(12个9),确保数据随时可访问。此外,OSS支持多版本控制、跨区域复制等功能,为数据安全与业务连续性提供有力保障。贰、CDN:全球加速,提升用户体验内容分发,缩短访问延迟CDN通过在全球范围内部署节点,将网站内容缓存至距离用户最近的服务器,大大减少了数据传输的距离和时间,显著降低访问延迟,提升用户浏览体验。尤其对于具有大量静态资源(如图片、视频、CSS、JS文件等)的网站,效果尤为明显。流量成本控制通过CDN分发,大部分用户请求直接由CDN节点响应,减轻了源站压力,降低了回源带宽费用。同时,阿里云CDN采用阶梯计费方式,随着使用量增大,单位流量成本逐渐降低,有效控制了大流量场景下的成本支出。叁、OSS+CDN:双剑合璧,降本增效简化网站架构,降低运维成本将网站静态资源托管于OSS,并配合CDN进行分发,可以简化网站架构,减少服务器负担,降低运维复杂度。用户只需专注于核心业务逻辑开发与运营,无需过多关注存储扩容、数据备份、服务器维护等繁琐工作,从而节省人力及时间成本。实时同步,保证内容一致性OSS与CDN深度集成,支持自动刷新、预热等机制,确保CDN节点上的内容与OSS中的原始数据保持实时同步,避免因数据更新不及时导致的用户体验下降。数据分析,助力精细化运营阿里云CDN提供详尽的访问日志和数据分析功能,帮助用户了解用户行为、地域分布、热门资源等信息,为网站优化、精准营销提供数据支持,进一步提升运营效率。总结来说,阿里云OSS与CDN的组合使用,不仅从存储成本、访问速度、运维复杂度等多个维度降低了建站成本,还提升了网站性能与用户体验,为企业的线上业务发展提供了强大支撑。在数字化转型的浪潮中,善用云服务工具,尤其是如阿里云OSS+CDN这样的“降本增效”组合拳,无疑是企业实现低成本、高效率建站的明智之选。肆、实战1. 创建对象存储OSS当我们使用OSS+CDN的组合方式时,我们购买资源包时,只需要购买两个(1)标准存储放,用于放我们上传的文件(2)CDN回源流量包,用于CDN回源流量。对于这两个资源包,在OSS中是相对比较便宜的,我们不需要在购买昂贵的外网流出费用资源包。我们不介绍如何使用OSS,本文假设你已经创建了一个Bucket找到【权限控制】→【读写权限】,将Bucket ACL改成私有,之所以改成私有,我是基于这三个考虑(1)我使用阿里云的CDN,不会影像CDN回源(2)防止有人通过默认的域名恶意刷流量(3)防止产生外网流出费用。找到【Bucket配置】→【域名管理】,点击绑定域名,绑定我们自己的域名。配置完域名后,我们点击阿里云CDN加速,会自动跳转到阿里云CDN配置界面2.CDN配置CDN配置中,主要是要注意回源配置在配置源站信息时,我们选择OSS域名,在域名中,会自动列出我们已经创建的Bucket,我们选择对应的Bucket还记得我们上面在配置Bucket是设置的ACL是私有的,所以在CDN的回源配置中,我们需要勾选阿里云OSS私有Bucket回源3.使用最后需要注意的一点就是,我们在使用图片是,需要通过我们绑定的二级域名,不能使用阿里云OSS默认的域名,如果你没有配置Bucket ACL为私有,那么使用阿里云默认域名访问时,会产生外网流出费用,如果配置了配置Bucket ACL为私有,那么阿里云默认的域名是不能访问的,这也是为什么我们配置Bucket ACL为私有的一个原因。
2024年03月26日
762 阅读
0 评论
0 点赞