目录
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、说明
-
读取 PNG 图像:
BufferedImage pngImage = ImageIO.read(new File(inputImagePath));
使用
ImageIO.read
方法读取 PNG 图像。 -
创建空的 JPG 图像:
BufferedImage jpgImage = new BufferedImage( pngImage.getWidth(), pngImage.getHeight(), BufferedImage.TYPE_INT_RGB);
创建一个空的 JPG 图像,指定相同的宽度和高度,并使用 RGB 颜色模型。
-
绘制 PNG 图像到 JPG 图像:
jpgImage.createGraphics().drawImage(pngImage, 0, 0, null);
使用
Graphics
对象将 PNG 图像绘制到 JPG 图像中。 -
设置 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 表示最高质量
使用
ImageWriter
和ImageWriteParam
来设置 JPG 的压缩质量,其中1.0f
表示最高质量。 -
写入 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();
}