java - 我应该将 BufferedImage.TYPE_4BYTE_ABGR 转换为 BufferedImage.TYPE_3BYTE_BGR 吗?

标签 java image image-processing rgb rgba

我正在研究图像插值,我使用双三次插值来使用AffinedTransformOp将java中图像的分辨率加倍。我使用了BufferedImage进行放大时使用 TYPE_4BYTE_ABGR。当我尝试使用 ImageIO.write 保存我的高档图像时,我发现 openjdk 不支持 TYPE_4BYTE_ABGRjpeg 编码,所以我转换了这个将图像从 TYPE_4BYTE_ABGR 放大到 TYPE_3BYTE_BGR。当我将其保存到文件夹中时,发现此高档图像占用的内存比原始图像占用的内存少(大约一半)。

因此,我假设原始(输入)图像由四个 channel ARGB 表示,而高档(输出)图像采用 3 个 channel RGB ,这就是获得更少内存的原因.

现在我的问题是我应该使用这种转换吗?
是否有一些信息丢失了?
图像质量保持不变吗?

P.S:我从 ImageIO 的文档中读到,当我们将 ARGB 转换为 RGB 时,alpha 值会预乘为 RGB 值,我认为它不应该影响图像的质量。

最佳答案

我解决了我的问题并希望分享我的答案。实际上我的原始图像类型是灰度,原始图像的色彩空间是灰色(即只有一个 channel ,8 位),质量为 90。
当我使用 TYPE_4BYTE_ABGR 时出现问题进行升级而不是使用TYPE_BYTE_GRAY。其次,当您尝试将此图像保存在 jpeg 格式的文件中时,ImageIO.write 默认使用 75 的压缩,因此图像尺寸会变小。您应该使用适合您的压缩系数,或者您应该将其保存为 PNG 格式。
您可以在 Linux 中使用 identify -verbos image.jpg 查看有关您的图像的信息,并可以看到色彩空间、图像类型和质量等
可以查看这个post了解如何在 ImageIO 中手动设置压缩质量。

关于java - 我应该将 BufferedImage.TYPE_4BYTE_ABGR 转换为 BufferedImage.TYPE_3BYTE_BGR 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56786078/

相关文章:

java - Spring @ExceptionHandler(Exception.class) 总是被调用。为什么?

java - 为什么要显式抛出 NullPointerException 而不是让它自然发生?

matlab - 中心裁剪或填充帧内的图像

java - 找到多维数组中最大的元素

java - Jersey 认证

html - 如何使用angularjs使图像 float

java - 在图像上添加按钮

c# - 从 IP 摄像机流式传输图像后如何将图像保存到数据库?

c++ - 模糊高斯算法是什么样的?有实现的例子吗?

java - 检测两个图像之间的变化(检测新对象的出现)