Java图片批量压缩像素的实现方法

 更新时间:2021年12月09日 11:51:33   作者:java李杨勇  
我们开发中经常会遇到原图清晰度高,考虑到效率问题,我们不可能拿原图进行显示,服务端一般都要对图片进行压缩处理,然后发送给客户端显示,这篇文章主要给大家介绍了关于Java图片批量压缩像素的实现方法,需要的朋友可以参考下

图片压缩大法

为了防止用户流量的丢失,即使在5g 即将来临的情况下,压缩算法依旧是很有必要的,额跑题了,不好意思,今天介绍的不是压缩算法,讲啥呢?主要讲讲如何通过 java 将图片进行压缩,尽可能的控制压缩损比,不仅仅是为了减少存储,其目的是快速呈现给用户,只有良好的体验,才会在当今这个急躁的年代减少流量的损失。

最近因为公司要需要xxx认证上传测试用例功能的具体截图、发现有大小限制、所以就进行了图片压缩,简单记录一下。

压缩前大小:

压缩后大小:

具体代码实现:

main方法测试:

 public static void main(String[] args) throws IOException {

        String modpath = "C:\\Users\\Administrator\\Desktop\\鲲鹏认证\\test\\";

        getFiles("C:\\Users\\Administrator\\Desktop\\鲲鹏认证\\测试用例清单", modpath, 160);//将图片压缩至100宽

    }

文件大小处理

/**

     * @param srcPath 原图片路径

     * @param desPath 转换大小后图片路径

     * @param width   转换后图片宽度

     * @param height  转换后图片高度

     */

    public static void resizeImage(String srcPath, String desPath, int width, int height) throws IOException {

        File srcFile = new File(srcPath);

        Image srcImg = ImageIO.read(srcFile);

        BufferedImage buffImg = null;

        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

        //使用TYPE_INT_RGB修改的图片会变色

        buffImg.getGraphics().drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

        String filePath="";

        if (srcFile.getName().contains("#")) {

             filePath = srcFile.getName().replace("#", "");

        }else{

            filePath=srcFile.getName();

        }

        ImageIO.write(buffImg, "PNG", new File(desPath + filePath));

    }

获取目录文件信息

/**

     * @param scaleSize 图片的修改比例,目标宽度

     */

    public static void getFiles(String path, String modPath, int scaleSize) throws IOException {

        ArrayList<String> files = new ArrayList<String>();

        File file = new File(path);

        File[] tempList = file.listFiles();

        //循环读取目录下图片

        for (int i = 0; i < tempList.length; i++) {

            String filePath = tempList[i].getName();

            if (tempList[i].isFile()) {

                System.out.println("文件:" + filePath + "-" + tempList[i].getAbsolutePath().replaceAll("\\\\", "/"));

                String[] imagePath = tempList[i].getAbsolutePath().replaceAll("\\\\", "/").split("/");

                String imageNumber = null;

                FileUtil.resizeImage(tempList[i].getAbsolutePath().replaceAll("\\\\", "/"), modPath, 160, 160);

                files.add(tempList[i].toString());

            }

            if (tempList[i].isDirectory()) {

                  System.out.println("文件夹:" + tempList[i]);

            }

        }

        System.out.println(path + "下文件数量:" + files.size());

    }

控制台目录压缩成功保存到盘符:

附:利用Graphics类如何进行压缩图像

Graphics类提供基本绘图方法,Graphics类提供基本的几何图形绘制方法,主要有:画线段、画矩形、画圆、画带颜色的图形、画椭圆、画圆弧、画多边形、画字符串等。 这里不做一一赘述, 进重点介绍一下,利用Graphics类如何进行压缩图像。不多说直接上代码。

	/**

	 * compressImage

	 * 

	 * @param imageByte

	 *            Image source array

	 * @param ppi

	 * @return

	 */

	public static byte[] compressImage(byte[] imageByte, int ppi) {

		byte[] smallImage = null;

		int width = 0, height = 0;

 

		if (imageByte == null)

			return null;

 

		ByteArrayInputStream byteInput = new ByteArrayInputStream(imageByte);

		try {

			Image image = ImageIO.read(byteInput);

			int w = image.getWidth(null);

			int h = image.getHeight(null);

			// adjust weight and height to avoid image distortion

			double scale = 0;

			scale = Math.min((float) ppi / w, (float) ppi / h);

			width = (int) (w * scale);

			width -= width % 4;

			height = (int) (h * scale);

 

			if (scale >= (double) 1)

				return imageByte;

 

			BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

			buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

			ByteArrayOutputStream out = new ByteArrayOutputStream();

			ImageIO.write(buffImg, "png", out);

			smallImage = out.toByteArray();

			return smallImage;

 

		} catch (IOException e) {

			log.error(e.getMessage());

			throw new RSServerInternalException("");

		}

	}

其实,关键点就两处

BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

总结

到此这篇关于Java图片批量压缩像素实现的文章就介绍到这了,更多相关Java图片批量压缩像素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈java中的重载和重写的区别

    浅谈java中的重载和重写的区别

    本文主要介绍了java中的重载和重写的区别。具有一定的参考价值,下面跟着小编一起来看下吧,希望能够给你带来帮助
    2021-11-11
  • SpringCloud之@FeignClient()注解的使用方式

    SpringCloud之@FeignClient()注解的使用方式

    这篇文章主要介绍了SpringCloud之@FeignClient()注解的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java8新特性Stream短路终端操作实例解析

    Java8新特性Stream短路终端操作实例解析

    这篇文章主要介绍了Java8新特性Stream短路终端操作实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Spring Boot集成Thymeleaf模板引擎的完整步骤

    Spring Boot集成Thymeleaf模板引擎的完整步骤

    这篇文章主要给大家介绍了关于Spring Boot集成Thymeleaf模板引擎的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • springcloud如何用Redlock实现分布式锁

    springcloud如何用Redlock实现分布式锁

    本文主要介绍了springcloud如何用Redlock实现分布式锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 使用spring连接及操作mongodb3.0实例

    使用spring连接及操作mongodb3.0实例

    这篇文章主要介绍了使用spring连接及操作mongodb3.0实例,详细的介绍了使用spring的情况下,在java中简单操作mongodb。有兴趣的可以了解一下。
    2016-12-12
  • 深入JAVA对象深度克隆的详解

    深入JAVA对象深度克隆的详解

    本篇文章是对JAVA对象深度克隆进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • spring boot 使用utf8mb4的操作

    spring boot 使用utf8mb4的操作

    这篇文章主要介绍了spring boot 使用utf8mb4的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java关键字volatile和synchronized作用和区别

    Java关键字volatile和synchronized作用和区别

    这篇文章主要为大家详细介绍了Java关键字volatile和synchronized的作用和区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Mybatis批量插入Oracle数据的方法实例

    Mybatis批量插入Oracle数据的方法实例

    在开发中或多或少都会遇到数据批量插入的功能,最近我在做项目的过程中就遇到了这样一个问题,下面这篇文章主要给大家介绍了关于Mybatis批量插入Oracle数据的相关资料,需要的朋友可以参考下
    2022-01-01

最新评论