热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】

这篇文章主要介绍了Java实现的上传并压缩图片功能,可实现图片的等比例压缩或原尺寸压缩,涉及java文件读写、转换、传输等相关操作技巧,需要的朋友可以参考下

本文实例讲述了Java实现的上传并压缩图片功能。分享给大家供大家参考,具体如下:

先看效果:

原图:1.33M

处理后:27.4kb

关键代码:

package codeGenerate.util;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageZipUtil {
  public static void main(String[] args) {
    zipWidthHeightImageFile(new File("C:\\spider\\3.png"),new File("C:\\spider\\3-1.jpg"),425,638,0.7f);
    //zipImageFile(new File("C:\\spider\\2.JPG"),new File("C:\\spider\\2-2.JPG"),425,638,0.7f);
    //zipImageFile(new File("C:\\spider\\3.jpg"),new File("C:\\spider\\3-3.jpg"),425,638,0.7f);
    System.out.println("ok");
  }
  /**
   * 根据设置的宽高等比例压缩图片文件
先保存原文件,再压缩、上传 * @param oldFile 要进行压缩的文件 * @param newFile 新文件 * @param width 宽度 //设置宽度时(高度传入0,等比例缩放) * @param height 高度 //设置高度时(宽度传入0,等比例缩放) * @param quality 质量 * @return 返回压缩后的文件的全路径 */ public static String zipImageFile(File oldFile,File newFile, int width, int height,float quality) { if (oldFile == null) { return null; } try { /** 对服务器上的临时文件进行处理 */ Image srcFile = ImageIO.read(oldFile); int w = srcFile.getWidth(null); int h = srcFile.getHeight(null); double bili; if(width>0){ bili=width/(double)w; height = (int) (h*bili); }else{ if(height>0){ bili=height/(double)h; width = (int) (w*bili); } } String srcImgPath = newFile.getAbsoluteFile().toString(); System.out.println(srcImgPath); String subfix = "jpg"; subfix = srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length()); BufferedImage buffImg = null; if(subfix.equals("png")){ buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); }else{ buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } Graphics2D graphics = buffImg.createGraphics(); graphics.setBackground(new Color(255,255,255)); graphics.setColor(new Color(255,255,255)); graphics.fillRect(0, 0, width, height); graphics.drawImage(srcFile.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); ImageIO.write(buffImg, subfix, new File(srcImgPath)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return newFile.getAbsolutePath(); } /** * 按设置的宽度高度压缩图片文件
先保存原文件,再压缩、上传 * @param oldFile 要进行压缩的文件全路径 * @param newFile 新文件 * @param width 宽度 * @param height 高度 * @param quality 质量 * @return 返回压缩后的文件的全路径 */ public static String zipWidthHeightImageFile(File oldFile,File newFile, int width, int height,float quality) { if (oldFile == null) { return null; } String newImage = null; try { /** 对服务器上的临时文件进行处理 */ Image srcFile = ImageIO.read(oldFile); String srcImgPath = newFile.getAbsoluteFile().toString(); System.out.println(srcImgPath); String subfix = "jpg"; subfix = srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length()); BufferedImage buffImg = null; if(subfix.equals("png")){ buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); }else{ buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } Graphics2D graphics = buffImg.createGraphics(); graphics.setBackground(new Color(255,255,255)); graphics.setColor(new Color(255,255,255)); graphics.fillRect(0, 0, width, height); graphics.drawImage(srcFile.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); ImageIO.write(buffImg, subfix, new File(srcImgPath)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return newImage; } }

说明:

1、根据需求大家可以自行设置质量参数quality,到底设置成多少,可以先看下效果在取值;

2、网上通用的方法用的是jdk自带jar包中方法,我这里衍生了一下:用Graphics2D,能够同时处理jpg和png格式;

3、new Color(255,255,255)是白色,等同于WHITE,但是用WHITE 的话,Linux下某些图片会有其它色值;

4、main中的宽425和高638可以根据自己的需求自行设置,但是对于长和宽一样的,按照400(小值的值425)*400来处理;

更多java相关内容感兴趣的读者可查看本站专题:《Java图片操作技巧汇总》、《java日期与时间操作技巧汇总》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》及《Java数据结构与算法教程》。

希望本文所述对大家java程序设计有所帮助。


推荐阅读
  • 本文详细探讨了 HAProxy 的基本概念及其与 LVS(Linux Virtual Server)的比较,特别是在内核空间与用户空间的工作差异。文章还深入介绍了 HAProxy 独有的数据结构——弹性二叉树,以及其在高并发场景下的表现。 ... [详细]
  • 本文详细介绍了MySQL表分区的概念、类型及其在实际应用中的实施方法,特别是针对Zabbix数据库的优化策略。 ... [详细]
  • 本文探讨了在Linux系统中尝试访问远程MySQL数据库时遇到的权限拒绝错误,特别是当使用非root用户进行连接时出现的'Access denied for user'错误。 ... [详细]
  • 本文详细介绍了将本地计算机和服务器从CentOS 7.2或7.3版本升级到7.4的过程,包括必要的准备步骤、执行升级的具体命令以及验证升级是否成功的检查方法。 ... [详细]
  • 成为一名高效的Java架构师不仅需要掌握高级Java编程技巧,还需深入理解JVM的工作原理及其优化方法。此外,对池技术(包括对象池、连接池和线程池)的应用、多线程处理、集合对象的内部机制、以及常用的数据结构和算法的精通也是必不可少的。同时,熟悉Linux操作系统、TCP/IP协议栈、HTTP协议等基础知识,对于构建高效稳定的系统同样重要。 ... [详细]
  • 本文介绍如何通过配置Linux服务器作为路由器来实现两个不同网段(192.168.1.0/24 和 192.168.2.0/24)之间的互联互通。 ... [详细]
  • 去控件化在线文档处理,推动高效信创办公环境
    探讨在线文档处理去控件化的趋势及其对构建高效信创办公生态的影响。 ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • 时序数据是指按时间顺序排列的数据集。通过时间轴上的数据点连接,可以构建多维度报表,揭示数据的趋势、规律及异常情况。 ... [详细]
  • 本文通过个人经历引出关于数学教学中的一个常见误解——被零除的结果,并深入探讨了浮点数中负零的存在及其背后的数学原理。 ... [详细]
  • 本文详细解析了LeetCode第300题——最长递增子序列的解题方法,特别是如何使用动态规划来高效解决问题。文章不仅提供了详细的代码实现,还探讨了常见的错误理解和正确的解题思路。 ... [详细]
  • 第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ... [详细]
  • 利用Dlib进行高效的人脸特征提取与识别
    本文介绍了Dlib库,一个集成了多种机器学习算法的C++工具包,特别适用于需要处理复杂任务的应用场景。Dlib不仅支持机器人技术、嵌入式系统开发、移动应用及高性能计算环境,还提供了强大的人脸检测与特征提取功能。 ... [详细]
  • 5G时代的广域网革新:企业迈向万物智联的新起点
    随着2020年初“新基建”概念的提出,以5G、AI、IoT等为核心的新型基础设施建设正逐步改变企业的运营模式。本文探讨了在这一背景下,企业广域网(WAN)如何通过5G与SD-WAN技术的融合实现转型升级,成为推动企业智能化、数字化发展的关键力量。 ... [详细]
author-avatar
伊达xx_790
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有