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();
        }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新开源:英伟达Nemotron-4 340B,哔哩哔哩Index-1.9B,谷歌RecurrentGemma-9B...

文章目录 1. 英伟达开源Nemotron-4 340B2. 哔哩哔哩开源轻量级模型 Index-1.9B3. 微软开源混合模型 Samba4. 谷歌开源 RecurrentGemma-9B,性能与Gemma相同5. Stable Diffusion 3 Medium:“最强文生图开源 AI 模型” 1. 英伟达开源Nemotron-4 340B 当地时…

C++初学者指南第一步---6.枚举和枚举类

C初学者指南第一步—6.枚举和枚举类 文章目录 C初学者指南第一步---6.枚举和枚举类1.作用域的枚举(enum class类型)(C11)2.无作用域的枚举(enum类型)3.枚举类的基础类型4.自定义枚举类映射5.和基础类型的互相转换 1.作用域的枚举(enum class类…

Python武器库开发-武器库篇之链接提取器(六十)

Python武器库开发-武器库篇之链接提取器(六十) 链接提取器介绍 链接提取器(Link Extractor)是一种用于从网页中提取链接的工具。它可以从网页的源代码中识别出所有的链接,并将这些链接提取出来。链接提取器可以用于各…

Python第二语言(十二、SQL入门和实战)

目录 1. Python中使用MySQL 1.1 pymysql第三方库使用MySQL 1.2 连接MySQL 1.3 操作数据库,创建表 1.4 执行查询数据库语句 2. python中MySQL的插入语句 2.1 commit提交 2.2 自动提交 3. pymysql案例 3.1 数据内容 3.2 DDL定义 3.3 实现步骤 3.4 文件操…

用python克隆了前男友的声音

声音克隆开源项目推荐:MockingBird 项目简介 MockingBird 是一个由开源社区开发的声音克隆项目,托管在 GitHub 上。该项目旨在通过深度学习技术实现高质量的声音克隆,使用户能够合成任意人的声音,并生成自然、流畅的语音输出。M…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 单词大师(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

010-基于Sklearn的机器学习入门:聚类(上)

本节及后续章节将介绍深度学习中的几种聚类算法,所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇,将介绍几种相对基础的聚类算法,包括K-均值算法和均值漂移算法。 目录 10.1 聚类概述 10.1.1 聚类的种类 10.1.2 Sklearn聚类子模…

搭建zookeeper、Kafka集群

搭建zookeeper、Kafka集群 1、绘制kafka的存储结构、副本机制2、搭建zookeeper集群3、搭建kafka集群4、使用kafka创建名为自己姓名汉语拼音的topic5、查看topic的分区和副本策略 1、绘制kafka的存储结构、副本机制 2、搭建zookeeper集群 实验环境准备: 3台服务器&…

npm install cnpm -g 报错4048

npm install cnpm -g 报错4048 设置淘宝镜像: 报错如下: 其他博主提供的方法都尝试了,比如管理员权限打开终端,删除.npmrc文件,清除缓存npm cache clean -f等都试了无效,最后怀疑是npm和cnpm版本不对应&…

JSP之原理剖析

什么是JSP: java Server Pages: java服务端页面,也和Servlet一样,用于动态Web技术? 最大特点: 写jsp就像在写HTML区别: HTML只给用户提供静态的数据JSP页面中可以嵌入Java代码,为用户提供动态数据 JSP原…

基于STM32和人工智能的智能四轴飞行器系统

目录 引言环境准备智能四轴飞行器系统基础代码实现:实现智能四轴飞行器系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景:智能飞行器管理与优化问题解决方案与优化收尾与总结 1. 引言 随着无人机技术的发展&…

群晖NAS部署在线PS工具Potopea并实现浏览器远程访问处理图片

文章目录 前言1. 部署Photopea2. 运行Photopea3. 群晖安装Cpolar4. 配置公网地址5. 公网访问测试6. 固定公网地址 前言 本文主要介绍如何在群晖NAS本地部署Potopea在线图片PS编辑工具,并结合cpolar内网穿透实现公网环境远程访问本地部署的Potopea处理图片. Photop…

【CT】LeetCode手撕—103. 二叉树的锯齿形层序遍历

目录 题目1- 思路2- 实现⭐103. 二叉树的锯齿形层序遍历——题解思路 2- ACM实现 题目 原题连接:103. 二叉树的锯齿形层序遍历 1- 思路 二叉树的层序遍历,遇到奇数时,利用 Collections.reverse() 翻转即可 2- 实现 ⭐103. 二叉树的锯齿形层…

【第17章】Vue实战篇之注册界面

文章目录 前言一、搭建界面二、数据绑定1.定义响应数据2.绑定数据 三、数据校验1. 定义校验规则2. 表单校验3. 展示 四、注册接口调用1. user.js2. Login.vue 五、展示总结 前言 本章内容主要包含&#xff1a; 注册界面搭建数据绑定表单校验调用后端接口 一、搭建界面 <s…

Java23种设计模式(二)

1、单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有…

电脑硬盘文件隐藏了怎么恢复数据?轻松上手不求人

在数字化时代&#xff0c;电脑硬盘中存储的数据对于个人和企业而言都至关重要。然而&#xff0c;有时我们可能会遇到一些意想不到的情况&#xff0c;比如硬盘中的文件突然消失了或者变成了隐藏状态。这种情况不仅让人感到困惑&#xff0c;还可能对日常工作和生活造成不小的影响…

【unity笔记】三、冰山碰撞变成碎块效果

一、模型准备 共需准备两个模型&#xff0c;一个原始模型&#xff0c;一个破碎后的模型。 破碎后的模型制作教程&#xff1a; 下载Blender 导入原始模型在添加偏好设置中添加Cell Fracture插件&#xff0c;调整模型碎裂效果。导出&#xff0c;保存到项目预制体文件夹。 二、…

胡说八道(24.6.17)——STM32以及通信杂谈

之前的文章中咱们谈到了STM32的时钟&#xff0c;今天我们来联系实际&#xff0c;来看看内部时钟下和外部时钟下的两种不同时钟的电平翻转。本次终于有硬件了&#xff0c;是最基础的STM32F103C8T6。 首先是&#xff0c;内部时钟的配置操作。 系统的内部时钟是72MHz&#xff0c;由…

【Windows系统】文件操作出现“文件访问被拒绝”弹窗问题

环境 系统&#xff1a;win10x64 版本&#xff1a;1709 问题 重命名系统文件夹文件&#xff0c;有时会出现【文件访问被拒绝】的弹窗&#xff0c;导致操作失败。 如何才能避免弹窗&#xff0c;成功操作&#xff1f; 解决方法 前提&#xff1a;实施以下解决&#xff0c;首先…

设置角色运动的动画

(1) 打开Assets-UnityTechnologies-Animation-Animators&#xff0c;Create-Animation-Controller,命名为JohnLemon (2) 打开JohnLemon&#xff0c;出现下图 (3) 依次将Assets-UnityTechnologies-Animation-Animation中的JohnIdle和JohnWalk拖放到Base Layer窗口中 (4) 右击Idl…