【问题标题】:Java JPG To PngJava JPG 转 PNG
【发布时间】:2011-08-28 06:14:19
【问题描述】:

我在整个应用程序中使用一种通用格式将图像保存为 png。上传的任何 jpg 图像仍会使用以下代码保存为 png。

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

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

但这会保留 alpha,即使它在 jpg 中不存在,所以 2MB 图像 7MB 和 6MB 到 16MB 。无论如何在不保持 alpha 的情况下保存 png 吗?

我需要转换为 PNG 的原因是,稍后当我在图像上添加文本时,它会失去实际分辨率。我已经尝试过无损 JPEG,但没有修复它。

【问题讨论】:

  • “上传的图片”,你会如何使用它们?根据这个答案,我也许可以提出一些建议......
  • jpgImagePAth 那就是已经上传 jpg 图片的地方。
  • 我的意思是,一旦它们被上传并存储在硬盘上。这是用于桌面应用程序吗?如果是这样,请解释一下。你打算通过互联网为他们服务吗?我们在谈论多少张图片?你会经常使用它们吗?
  • 这是一个网络应用程序。是的,我将通过互联网提供服务。 800KB 的图片保存为 png 后变成 1.5MB。

标签: java image-processing awt image-editor


【解决方案1】:

导致文件大小增长的不是 Alpha 通道,而是文件类型。 JPG 使用有损压缩; PNG是无损压缩。换句话说,JPG 正在丢弃一些数据以减小文件的大小。这就是为什么您在保存为 JPG 时选择“质量”级别的原因 - 这决定了丢弃的数量。

你怎么知道你得到的是 Alpha 通道?如果您仍然想要 PNG 并且想确保要删除 alpha 通道,请将图像类型设置为 BufferedImage.TYPE_RGB,例如

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_RGB);

您必须获取与新的 BufferedImage 关联的图形对象并将 jpg 复制到其上,然后将其写出。 This question 和你的不太一样,但是有你可能会觉得有用的示例代码。

保罗

【讨论】:

  • JPG 图像不透明。因此,当用户上传 JPG 时,我认为我不想使用 alpha
  • +1 因为如果存储了 Alpha 通道,BufferedImage 类型似乎是最有可能的罪魁祸首。听起来 OP 可能有充分的理由选择 PNG。存储空间很便宜,但存储未使用的 alpha 通道似乎很愚蠢。
  • 是的,我知道 JPG 图像不透明。我想知道为什么您认为您正在编写的 PNG 包含透明度信息。
  • 我的意思是保存为 png 时添加的任何附加信息。反正我可以把它关掉吗?
  • 不,这个答案解释说 PNG 总是比与 JPG 完全相同的图像大。如果你想使用 PNG,你将不得不接受较大的文件大小。
【解决方案2】:

我不知道你具体是什么情况。但我应该保留 JPEG JPEG。将 JPEG 转换为 PNG 的唯一好处是浪费硬盘空间。

【讨论】:

  • 我猜是在您回答后进行的编辑中,但与 JPEG 相比,PNG 的一个明显优势是防止字母周围的失真伪影。
  • @Olaf:是的,这绝对是真的。但这是 PNG 的优势,而不是从 JPEG 转换为 PNG 的优势。
猜你喜欢
  • 2015-10-06
  • 2011-03-01
  • 1970-01-01
  • 2021-06-29
  • 2012-12-21
  • 2012-03-22
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
相关资源
最近更新 更多