Java 中如何对图片进行压缩处理

这篇具有很好参考价值的文章主要介绍了Java 中如何对图片进行压缩处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题背景

图片过大时,会造成页面卡顿甚至于报错,而且现在页面,接口,很多地儿都有报文传输的最大限制要求,另外不知道各位有没有遇到过页面渲染比较大的 base64 图片时,会非常的卡顿。所以,我们必须对用户上传的原始图片进行压缩处理。


为何图片经过 base64 编码转换后文件会变大?

图片经过base64编码转换后,文件会变大的原因是因为base64编码会将每个3字节的数据转换成4字节的数据,并且在转换的过程中还会添加一些额外的字符。这些额外的字符包括"="、"+"、"/"等,它们在原始的图片数据中是不存在的。

因此,当我们将图片进行base64编码后,会使得数据变得更大,因为它需要更多的字符来表示相同的原始数据。

另外,使用base64编码也会导致网络传输速度变慢,因为相同的数据需要传输更多的字符。因此,在需要传输大量数据的情况下,建议使用原始的二进制数据,而不是进行base64编码。


解决方案

1、先读取源图片

        new ImgCompress(srcFilePath);

2、进行图片压缩

        resize(int w, int h, String toPic)

3、源码工具类如下:

package com.example.util;

import java.awt.image.BufferedImage;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
/**
 * 图片压缩
 * @author 86183
 *
 */
@SuppressWarnings("restriction")
public class ImgCompress {
	static BufferedImage img = null;
	public static void main(String[] args) throws IOException {
		
		String fromPic = "C:\\Users\\86183\\Pictures\\儿童节插画手绘人物.png";
		String toPic = "C:\\Users\\86183\\Pictures\\儿童节插画手绘人物_min.png";
		ImgCompress imgCom = new ImgCompress(fromPic );
		imgCom.resize(400, 400, toPic);

		
	}
	/**
	* 构造函数
	*/
	public ImgCompress(String fileName) throws IOException {

	     File file = new File(fileName);// 读入文件
	     img = ImageIO.read(file);      // 构造Image对象
	}

	/**
	 * 强制压缩/放大图片到固定的大小
	 *
	 * @param w int 新宽度
	 * @param h int 新高度
	 */
	public void resize(int w, int h, String toPic) throws IOException {
	// SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
	    BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
	    image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图
	    File destFile = new File(toPic);

	    FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流
	    // 可以正常实现bmp、png、gif转jpg
	    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
	    encoder.encode(image); // JPEG编码
	    out.close();
	}
}

备注

这里我们用到了 jdk 下的依赖包

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

那 maven 打包时 为何 jdk 下的包打包不进去?

如果你的maven项目中依赖了JDK下的包,但是在打包时这些包没有被打包进去,可能是因为maven默认只会把项目中依赖的jar包打包进去,而JDK下的包被认为是系统级别的依赖,不会自动加入打包的jar中。

为了解决这个问题,有两种常用的方法:

1. 引入JDK包的maven依赖
你可以在pom.xml中加入类似下面的依赖,把JDK下的包引入到maven项目中,这样就能够被打包进去了:

<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>${java.version}</version>
    <scope>system</scope>
    <systemPath>${java.home}/lib/tools.jar</systemPath>
</dependency>

2. 手动添加JDK包
如果不想引入依赖,也可以手动将JDK下的包添加到打包的jar文件中,可以在maven打包命令中加入以下参数:

mvn package -Dmaven.compiler.includeJavaxPackages=true

这样打包时就会包含JDK下的包了。


maven 打包时,会提示找不到该包,这里我们需要在 maven 的 POM 文件里添加一个打包依赖的设置项。

<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</target>
					<encoding>UTF-8</encoding>
					<compilerArguments>
                       <verbose />
                       <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
                   </compilerArguments>
				</configuration>
			</plugin>

 添加的位置如下: 

java 图片压缩,Java,java,开发语言,压缩图片

 附加内容:前端 Jquery 和 后台 Java 判断文件大小的方式。

前端:
var fileSize = $("#"+fileId)[0].files[0].size/(1024*1024);
console.log("上传文件大小:"+fileSize+"M");

上面变量 fileId 就是文件 file 输入框的 id 值。

后端:
/**
     * 判断文件大小处于限制内
     *
     * @param fileLen 文件长度
     * @param fileSize 限制大小
     * @param fileUnit 限制的单位(B,K,M,G)
     * @return
     */
	public static boolean checkFileSizeIsLimit(Long fileLen, int fileSize, String fileUnit) {
      double fileSizeCom = 0;
      if ("B".equals(fileUnit.toUpperCase())) {
          fileSizeCom = (double) fileLen;
      } else if ("K".equals(fileUnit.toUpperCase())) {
          fileSizeCom = (double) fileLen / 1024;
      } else if ("M".equals(fileUnit.toUpperCase())) {
          fileSizeCom = (double) fileLen / (1024*1024);
      } else if ("G".equals(fileUnit.toUpperCase())) {
          fileSizeCom = (double) fileLen / (1024*1024*1024);
      }
      if (fileSizeCom > fileSize) {
          return false;
      }
      return true;
  }

直接用工具类即可,代码简单明了,也没啥太多可说明和备注的。文章来源地址https://www.toymoban.com/news/detail-659672.html

到了这里,关于Java 中如何对图片进行压缩处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java常见面试题:如何使用Java进行JPA框架开发?

    JPA(Java Persistence API)是一个Java平台的标准持久化API,它提供了一种标准的查询语言和API来将Java对象与关系数据库进行映射。 以下是使用Java进行JPA框架开发的详细步骤: 添加JPA依赖 首先,你需要在项目中添加JPA的依赖。如果你使用的是Maven项目,可以在pom.xml文件中添加以

    2024年01月18日
    浏览(51)
  • 如何使用Java进行桌面应用的开发?

    使用Java进行桌面应用的开发可以借助JavaFX或Swing框架。下面为你提供一些基本的步骤: 安装Java开发工具包(JDK):首先,确保你已经安装了Java开发工具包(JDK),并正确配置了环境变量。 选择GUI框架:Java提供了两个主要的桌面GUI框架:JavaFX和Swing。JavaFX是Oracle推荐的最新的

    2024年02月09日
    浏览(47)
  • 如何使用Java进行人工智能开发?

    Java作为一门面向对象的编程语言,在人工智能领域也发挥着重要作用。Java可以借助常见的机器学习库,例如TensorFlow和Keras等,进行机器学习和深度学习的开发。下面是使用Java进行人工智能开发的一些步骤和工具。 准备工作 在使用Java进行人工智能开发之前,需要掌握Java的基

    2024年02月21日
    浏览(46)
  • 使用Java IO进行压缩和解压缩 | ZIP和GZIP的实现

      Java IO中的压缩和解压缩功能主要通过 java.util.zip 包和 java.util.jar 包来实现,并具有以下作用和优势: 方便易用 :Java提供了简洁而易于使用的API,使得压缩和解压缩变得简单和方便。 多种压缩算法支持 :Java提供了多种压缩算法,如ZIP、GZIP、JAR等,可以根据不同的需求

    2024年02月15日
    浏览(46)
  • 基于Java和Spring:实现图片压缩、WebP格式转换与水印添加

    大多数公司通常会拥有面向企业端(B端)和消费者端(C端)的应用,如淘宝IOS/Android端和PC端。对于C端产品而言,往往具备访问量大、数据量庞大的特点,例如类似淘宝的商品详情页,其中包含大量且尺寸较大的图片。在这种前提下,为了确保良好的用户体验,需要在保证图

    2024年03月24日
    浏览(52)
  • 【Git协同】误采用压缩包下载进行开发后如何将代码合入主干

    有时候对于一些使用git协同的项目,不小心可能会采用压缩包的方式下载代码,当在此代码上进行修改后才发现项目里压根没有git相关文件,这里提供一种针对此类现象的解决方案。 有两个协同开发者,开发者2误使用压缩包的方式下载代码进行修改,此时master分支已经被开

    2024年02月11日
    浏览(38)
  • Android 安卓开发语言kotlin与Java该如何选择

            如今在Android开发中,应用层开发语言主要是Java和Kotlin,Kotlin是后来加入的,主导的语言还是Java。kotlin的加入仿佛让会kotlin语言的开发者更屌一些,其实不然。         有人说kotlin的引入是解决开发者复杂的逻辑,并且对空指针控制的比较友好,但是我们在开

    2024年02月11日
    浏览(61)
  • 【JAVA开发面试】如何处理并发访问如何进行代码的单元测试Java多线程编程消息中间件设计模式技术难题是如何解决的

    【 点我-这里送书 】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明

    2024年02月03日
    浏览(48)
  • 【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(基础编程篇)

    Preconditions(前置条件):让方法调用的前置条件判断更简单 。 Guava在Preconditions 类中提供了若干前置条件判断的实用方法,我们强烈建议在 Eclipse 中静态导入这些方法。每个方法都有三个变种: 当方法没有额外参数时,抛出的异常中不包含错误消息,这会使得调用方很难确

    2024年02月07日
    浏览(71)
  • 使用python对图片进行压缩

    对于图片,强行被定义高和宽会变形,我们希望图片被改变大小后,比例保持不变,完成对图片的压缩。 1.pillow : pip install pillow -i https://pypi.douban.com/simple 2. os : 连接文件,并获取文件夹下的文件名 获取picture文件下的相关图片的路径,将路径放到列表里面进行存储 使用Image模

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包