Java JPG转Png

3

我在整个应用程序中使用PNG作为通用的图像格式。无论上传什么JPG图像,都会按照以下代码将其保存为PNG。

java.awt.image.BufferedImage bufferedImage = ImageIO.read(jpgImagePAth);

 if(!IsExtensionPng(jpgImagePath)){
        ImageIO.write(bufferedImage, "png", new File(pptFolder, justNamePng));
  }

但是,这样做可以保留alpha通道,即使在jpg文件中没有alpha通道,也会使2MB的图像变成7MB或6MB变成16MB。有没有办法在不保留alpha通道的情况下保存png格式的图片?

我需要将图片转换为PNG格式的原因是,当我在图片上添加文本时,它会失去实际分辨率。我已经尝试使用无损JPEG格式,但并没有解决这个问题。


“上传的图片”,你会如何使用它们?根据你的回答,我或许可以提出一些建议… - Martijn Courteaux
jpgImagePath这是已经上传了的JPG图像的路径。 - Pit Digger
1
我的意思是,一旦它们上传并存储在硬盘上。这是用于桌面应用程序吗?如果是,可以解释一下吗?你会通过互联网提供它们吗?我们要谈论多少张图片?你会经常使用它们吗? - Martijn Courteaux
这是一个网络应用程序。是的,我将通过互联网提供服务。800KB 的图像保存为 PNG 后变为 1.5MB。 - Pit Digger
2个回答

2
不是alpha通道导致文件大小增加,而是文件类型。JPG使用有损压缩;PNG使用无损压缩。换句话说,JPG会丢失一些数据以减小文件的大小。这就是为什么在保存为JPG时可以选择“质量”级别 - 它决定了要丢弃多少数据。
如果您仍然希望使用PNG并确保删除alpha通道,可以将图像类型设置为BufferedImage.TYPE_RGB,例如:
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_RGB);

你需要获取与新BufferedImage相关联的图形对象,并将jpg复制到它上面,然后写出来。这个问题与你的不完全相同,但有一些示例代码可能对你有用。

JPG 图像不是透明的。因此,当用户上传 JPG 图像时,我不想使用 alpha 通道。 - Pit Digger
+1 是因为如果存在 alpha 通道,则 BufferedImage 类型似乎是最有可能的罪魁祸首。听起来 OP 可能有选择 PNG 的充分理由。存储空间很便宜,但存储未使用的 alpha 通道似乎有些愚蠢。 - eaj
是的,我知道JPG图像不透明。我想知道你为什么认为你写入的PNG文件包含透明信息。 - Paul
我的意思是,保存为PNG格式时添加的任何附加信息。我有没有办法关闭它? - Pit Digger
1
不,这个答案解释了PNG图像始终比同样的JPG图像大。如果你想使用PNG,你必须接受更大的文件大小。 - Jesse Webb

1

我不确定你的具体情况。但是我应该保持JPEG格式,将JPEG转换为PNG的唯一优点就是浪费硬盘空间。


1
我猜这是在你回答后进行的编辑,但PNG相比JPEG具有防止字母周围出现失真伪影的明显优势。 - Olaf
2
@Olaf:是的,那绝对是真的。但这是PNG的优点,而不是从JPEG转换为PNG的优点。 - Martijn Courteaux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接