全国免费咨询:

13245491521

VR图标白色 VR图标黑色
X

中高端软件定制开发服务商

与我们取得联系

13245491521     13245491521

2024-10-23_JAVA 图片压缩踩坑记

您的位置:首页 >> 新闻 >> 行业资讯

JAVA 图片压缩踩坑记 点击关注公众号,“技术干货”及时达! 最近公司需要重新梳理一下文件上传相关的工作,然后对用户上传的图片相关的东西做一下压缩吧,节省下带宽。 然后的话,发现很多图片处理都是只压缩 JPG 格式的,没有对 PNG 图片压缩做处理,但是看网上又有比较多的PNG在线压缩网站,不过 JAVA 好像 对 PNG 压缩实现好像不是特别多。 想找找看有没有一个类似于 tinypng 可以在 JAVA 中压缩 PNG 的通用图片压缩。 所以找了下解决方案,在这里做个记录 1. Thumbnails 的坑首先我直接引用了 Google 的 Thumbnails来做,官网上宣称压缩 jpg png 格式都可以,然后我随便找了几张图片试了下,发现并不行,最主要的问题是会把 png 格式的图片越压缩越大。 public static void main(String[] args) throws Exception { Thumbnails.Builder builder = Thumbnails.of(new File("E:\\壁纸\\expert.png")) .outputQuality(0.6f); builder.scale(1); builder.imageType(BufferedImage.TYPE_INT_ARGB); builder.toFile(new File("E:\\壁纸\\expert22.png")); }image.pngimage.png可以看到压缩 png 不仅没有让图片变小,反而反向压缩了,从原来的 47k 压缩到了 80k 具体可以看看这个 issuse https://github.com/coobird/thumbnailator/issues/77 2. 解决方案网上找了下解决方案,大概有两个 使用pdf渲染的开源软件OpenViewerFX, 这个里面包含类似 tinypng 压缩算法的图片压缩使用 java-png-compress-util 大神做好的使用libimagequant依赖库,使用java JNI调用实现对PNG图片进行压缩考虑到不同环境差异,决定还是依赖 OpenViewerFX 来做 png 的图片压缩 ★ 参考 java png 图片压缩 ”3. 测试 OpenViewerFX先试试原来的 expert22.png public static void main(String[] args) throws Exception { File file = new File("E:\\壁纸\\expert22.png"); PngCompressor.compress(file, file); }image.pngem..., 好吧好像没有变化,可能是图片已经够小的原因。不过没有像 Thumbnails 反向压缩了,那换一张图片试试 image.pngimage.png嗯,可以看到还是有效果的,直接压缩了 100多K 4. 代码实现引入依赖 dependency groupIdnet.coobird/groupId artifactIdthumbnailator/artifactId version0.4.20/version /dependency !-- https://mvnrepository.com/artifact/org.jpedal/OpenViewerFX -- dependency groupIdorg.jpedal/groupId artifactIdOpenViewerFX/artifactId version6.6.14/version /dependency ★ 需要注意 OpenViewerFX 的版本,高版本的 OpenViewerFX 已经没有 PngCompressor 类了,具体版本变化没仔细去研究了 ”图片压缩具体实现/** * 图片压缩 * @param file 图片地址 * @param extension 后缀名 */public void compressFile(File file, String extension) { try { if (!extension.matches("jpg|jpeg|png|gif|bmp")) { return; } BufferedImage bufferedImage = ImageIO.read(file); int width = bufferedImage.getWidth(); int height = bufferedImage.getHeight(); Thumbnails.Builder builder = Thumbnails.of(file) .outputQuality(0.6f); // 如果图片大于 1k 则重置为 1k 图片 if (width 1920 || height 1080) { builder.size(GlobalFile.LIMIT_WIDTH, GlobalFile.LIMIT_HEIGHT); } else { builder.scale(1); } // 如果是 png 则使用 TYPE_INT_ARGB 模式 if (extension != null && extension.equals("png")) { builder.imageType(BufferedImage.TYPE_INT_ARGB); } builder.toFile(file); // 如果图片是 png 则使用 OpenViewerFX 中的 PngCompressor 进行压缩 if (extension != null && extension.equals("png")) { PngCompressor.compress(file, file); } } catch (Exception e) { log.error("压缩图片失败", e); } }需要注意的是 png 使用 Thumbnails 做处理的话,需要使用 BufferedImage.TYPE_INT_ARGB 模式,不然有的 png 图片处理完之后背景会是黑色的对于 git 这种动态图片做压缩的话会丢失动态效果。5. 结语咳咳,这篇简单的文章就到这里就结束了,代码的话特别简单。只是调用了下第三方包做了下处理。 只是找寻合适的 png 第三方压缩包和测试方面,比较消耗时间。这篇文章就是踩下坑,节省下大家找寻第三方包的时间吧 点击关注公众号,“技术干货”及时达! 阅读原文

上一篇:2021-11-18_2021 GitHub年度报告:7300万开发者,最爱的依旧是Javascript 下一篇:2017-08-03_上海 | Daan's MindTalk TOPYS创意公开课 第十九回 Daan Lucas

TAG标签:

17
网站开发网络凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设网站改版域名注册主机空间手机网站建设网站备案等方面的需求...
请立即点击咨询我们或拨打咨询热线:13245491521 13245491521 ,我们会详细为你一一解答你心中的疑难。
项目经理在线

相关阅读 更多>>

猜您喜欢更多>>

我们已经准备好了,你呢?
2022我们与您携手共赢,为您的企业营销保驾护航!

不达标就退款

高性价比建站

免费网站代备案

1对1原创设计服务

7×24小时售后支持

 

全国免费咨询:

13245491521

业务咨询:13245491521 / 13245491521

节假值班:13245491521()

联系地址:

Copyright © 2019-2025      ICP备案:沪ICP备19027192号-6 法律顾问:律师XXX支持

在线
客服

技术在线服务时间:9:00-20:00

在网站开发,您对接的直接是技术员,而非客服传话!

电话
咨询

13245491521
7*24小时客服热线

13245491521
项目经理手机

微信
咨询

加微信获取报价