Java工具-实现无损png转换jpg格式

目录

1、背景说明

2、通过代码实现格式转换

3、无损转化

4、说明

读取 PNG 图像:

创建空的 JPG 图像:

绘制 PNG 图像到 JPG 图像:

设置 JPG 图片压缩质量:

写入 JPG 文件并关闭流:

5、jpg转png


1、背景说明

在项目中遇到一个情况,在使用海康NVR在线管理平台中,名单库管理模块,需要上传人员照片,进行人脸库构建。但是上传照片限制使用jpg、jpeg等格式,并且不支持png格式。

1、首先想到通过直接修改文件后缀名,尝试后,再次上传。提醒格式不支持

2、通过代码实现格式转换

利用hutool工具中的ImgUtil工具类 ,通过如下代码实现转化。

转换后图片大小减少,内容有损

import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;


public static void png2jpg(String source, String dest) throws IOException {
        Path p1 = Paths.get(source);
        Files.list(p1).forEach(p -> {
            String filename = p.toFile().getName();
            if(filename.endsWith("jpg") || filename.endsWith("jpeg")){
                return ;
            }
            String newFile = dest + "/" + filename.substring(0, filename.indexOf(".") ) + ".jpg";
            ImgUtil.convert(p.toFile(), new File(newFile));
        });
    }

3、无损转化

使用原生BufferedImage、Graphics,直接绘制图片,并且保持图片1:1 不压缩

代码如下:

import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;

import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class PngToJpgConverter {

    public static void main(String[] args) throws IOException {
        png2jpg("E:\\workspace\dest",
                "E:\\workspace\\dest2");
    }

    public static void png2jpg(String source, String dest) throws IOException {
        Path p1 = Paths.get(source);
        Files.list(p1).forEach(p -> {
            String filename = p.toFile().getName();
            if(filename.endsWith("jpg") || filename.endsWith("jpeg")){
                return ;
            }
            String newFile = dest + "/" + filename.substring(0, filename.indexOf(".") ) + ".jpg";
            convert(p.toFile().getAbsolutePath(), newFile);
        });
    }

    // 原始文件绝对路径、新文件绝对路径
    public static void convert(String inputImagePath, String outputImagePath){

        try {
            // 读取 PNG 图像
            BufferedImage pngImage = ImageIO.read(new File(inputImagePath));

            // 创建空的 JPG 图像,使用相同的宽度、高度和 RGB 颜色模型
            BufferedImage jpgImage = new BufferedImage(
                pngImage.getWidth(), pngImage.getHeight(), BufferedImage.TYPE_INT_RGB);

            // 将 PNG 图像绘制到 JPG 图像
            jpgImage.createGraphics().drawImage(pngImage, 0, 0, null);

            // 设置 JPG 图片压缩质量
            File outputFile = new File(outputImagePath);
            ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
            ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile);
            jpgWriter.setOutput(ios);

            ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam();
            jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            jpgWriteParam.setCompressionQuality(1.0f); // 1.0f 表示最高质量

            // 写入 JPG 文件
            jpgWriter.write(null, new javax.imageio.IIOImage(jpgImage, null, null), jpgWriteParam);

            // 关闭流
            ios.close();
            jpgWriter.dispose();

            System.out.println("PNG image has been converted to JPG successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4、说明

  1. 读取 PNG 图像

    BufferedImage pngImage = ImageIO.read(new File(inputImagePath));

    使用 ImageIO.read 方法读取 PNG 图像。

  2. 创建空的 JPG 图像

    BufferedImage jpgImage = new BufferedImage( pngImage.getWidth(), pngImage.getHeight(), BufferedImage.TYPE_INT_RGB);

    创建一个空的 JPG 图像,指定相同的宽度和高度,并使用 RGB 颜色模型。

  3. 绘制 PNG 图像到 JPG 图像

    jpgImage.createGraphics().drawImage(pngImage, 0, 0, null);

    使用 Graphics 对象将 PNG 图像绘制到 JPG 图像中。

  4. 设置 JPG 图片压缩质量

    ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next(); ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile); jpgWriter.setOutput(ios); ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam(); jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); jpgWriteParam.setCompressionQuality(1.0f); // 1.0f 表示最高质量

    使用 ImageWriterImageWriteParam 来设置 JPG 的压缩质量,其中 1.0f 表示最高质量。

  5. 写入 JPG 文件并关闭流

    jpgWriter.write(null, new javax.imageio.IIOImage(jpgImage, null, null), jpgWriteParam); ios.close(); jpgWriter.dispose();

    将 JPG 图像写入文件,并关闭流和释放资源。

5、jpg转png

 try {
            // 读取 JPG 图像
            BufferedImage jpgImage = ImageIO.read(new File(inputImagePath));

            // 创建空的 PNG 图像,使用相同的宽度、高度和颜色模型
            BufferedImage pngImage = new BufferedImage(
                jpgImage.getWidth(), jpgImage.getHeight(), BufferedImage.TYPE_INT_ARGB);

            // 将 JPG 图像绘制到 PNG 图像
            pngImage.createGraphics().drawImage(jpgImage, 0, 0, null);

            // 写入 PNG 文件
            ImageIO.write(pngImage, "png", new File(outputImagePath));

            System.out.println("JPG image has been converted to PNG successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/705644.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Opencv图像梯度计算

Opencv图像梯度计算 Sobel算子 可以理解为是做边缘检测的一种方法。 首先说明自己对图像梯度的简单理解:简单理解就是图像的颜色发生变化的边界区域在X方向和Y方向上的梯度值 Gx Gy 而Gx和Gy处的梯度的计算—使用下面的公式来进行计算。 G x [ − 1 0 1 − 2 0 …

计算机网络(5) ARP协议

什么是ARP 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定…

【MySQL】mysql中常见的内置函数(日期、字符串、数学函数)

文章目录 案例表日期函数字符串函数数学函数其他函数 案例表 emp students 表 exam_result 表 日期函数 注意current_time和now的区别 案例一: 创建一张表用来记录生日,表结构如下 添加日期: insert tmp (birthday) values (2003-01-3…

香港CN2线路回国加速CDN介绍

随着互联网的迅猛发展,跨境数据传输的需求日益增加。尤其对于中国内地用户来说,访问海外网站和应用时,常常会面临网络延迟高、加载速度慢的问题。为了优化这一体验,香港 CN2 线路回国加速 CDN 成为了许多企业和个人的首选解决方案…

从Log4j和Fastjson RCE漏洞认识jndi注入

文章目录 前言JNDI注入基础介绍靶场搭建漏洞验证注入工具 log4j RCE漏洞分析漏洞靶场检测工具补丁绕过 Fastjson RCE漏洞分析漏洞靶场检测工具补丁绕过 总结 前言 接着前文的学习《Java反序列化漏洞与URLDNS利用链分析》,想了解为什么 Fastjson 反序列化漏洞的利用…

Java中的方法重写与重载

在Java编程语言中,方法重写(Override)和方法重载(Overload)是实现代码多态性的两种基本方式。它们允许程序员以多种方式使用相同的方法名,增加了程序的可读性和可重用性,但它们的应用场景和规则…

Nginx+KeepAlived高可用负载均衡集群的部署

目录 一.KeepAlived补充知识 1.一个合格的群集应该具备的特点 2.健康检查(探针)常用的工作方式 3.相关面试问题 问题1 问题2 二.Keepealived脑裂现象 1.现象 2.原因 硬件原因 运用配置原因 3.解决 4.预防 方法1 方法2 方法3 方法4 三.…

【Spine学习04】之让角色动起来

1、切换左上角模式:设置改为动画 2、选择两个手臂的大臂节点 3、打开勾选自动关键帧按钮 4、开始K帧: Space空格可以快捷查看小黄人所有关键帧

英语翻译人工翻译优势

在全球化的时代,跨文化交流至关重要,而翻译则是连接不同语言和文化的重要桥梁。尽管近年来人工智能翻译取得了显著进展,但人工翻译的需求仍然无可替代,尤其是在专业和技术翻译领域。下面从专业角度阐述人工翻译相较于人工智能翻译…

python如何终止程序运行

方法1:采用sys.exit(0),正常终止程序,从图中可以看到,程序终止后shell运行不受影响。 方法2:采用os._exit(0)关闭整个shell,从图中看到,调用sys._exit(0)后整个shell都重启了(RESTAR…

[c++刷题]贪心算法.N01

题目如上: 首先通过经验分析,要用最少的减半次数,使得数组总和减少至一半以上,那么第一反应就是每次都挑数组中最大的数据去减半,这样可以是每次数组总和值减少程度最大化。 代码思路:利用大根堆去找数据中的最大值,…

VScode中连接并使用docker容器

前提条件: 1.在windows下安装Docker Desktop(方法可见下面的教程) Docker Desktop 安装使用教程-CSDN博客 2.在vscode安装3个必备的插件 3.先在ubuntu中把docker构建然后运行 4.打开vscode,按下图顺序操作 调试好之后上传到git上,然后后面…

李宏毅深度学习01——基本概念简介

视频链接 基本概念 Regression(回归): 类似于填空 Classification(分类): 类似于选择 Structure Learning(机器学习): ?? 机器学习找对应函数…

字符串排序-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第82讲。 字符串排序&#…

SSH协议

SSH协议简介 SSH(Secure Shell)是一种网络安全协议,用于在不安全的网络环境中提供加密的远程登录和其他网络服务。它通过加密和认证机制实现安全的访问和文件传输等业务,是Telnet、FTP等不安全远程shell协议的安全替代方案。 SSH协…

HSP_08章 断点调试

P100 断点调试 1. 基本介绍 一个实际场景 在开发中,新手程序员在查找错误时,这时有经验的程序员就会提示,可以用断点调试,一步一步的看源码执行的过程, 从而发现错误所在。 断点调试介绍 -基本介绍 2. 函数的调试

使用Ventoy制作U盘启动安装系统

简介 Ventoy是一个制作可启动U盘的开源工具。 无需反复地格式化U盘。你只要制作一次U盘启动盘,后面你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的系统镜像文件直接拷贝到U盘里面就可以启动了,无需其他操作。可以一次性拷贝很多个不同类型的镜像文件&…

文件监控工具——inotify-tools使用

在做灰盒测试和恶意程序分析的时候,经常需要寻找创建、删除、修改的文件,而在无法确定操作的文件或生成的文件路径时,就需要用到可以监控文件和目录的工具了。比如测试任意文件上传时,文件名被改为随机字符串且HTTP响应中不返回文…

光储充行业市场前景以及未来发展趋势

光储充行业作为新能源汽车产业链的重要环节,其市场前景广阔,未来发展趋势也呈现出积极向上的态势。随着新能源汽车市场的不断扩大,光储充设施的需求也日益增长,为行业的发展提供了强大的动力。 从未来发展趋势来看,光储…

每日一练:攻防世界:Misc文件类型

给了一个txt文本文件,因为题目是文件类型,我先开始一直在想关于文件头的知识。 这串数据看着像十六进制数据,我就直接把他转ASCII了 反转一下就是base64,因为base64没有_,所以去掉46ESAB_,base64解码Hex试…