我正在研究图像插值,我使用双三次插值来使用AffinedTransformOp
将java中图像的分辨率加倍。我使用了的
。当我尝试使用 BufferedImage
进行放大时使用 TYPE_4BYTE_ABGRImageIO.write
保存我的高档图像时,我发现 openjdk 不支持 TYPE_4BYTE_ABGR
的 jpeg
编码,所以我转换了这个将图像从 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/