我应该将 BufferedImage.TYPE_4BYTE_ABGR 转换为 BufferedImage.TYPE_3BYTE_BGR 吗?
Should I convert BufferedImage.TYPE_4BYTE_ABGR to BufferedImage.TYPE_3BYTE_BGR?
我正在处理图像插值,为此我使用双三次插值使用 AffinedTransformOp
将 java 中的图像分辨率加倍。我使用了 BufferedImage
of [=14] =] 在进行放大时。当我尝试使用 ImageIO.write
保存我的放大图像时,我发现 openjdk 不支持 TYPE_4BYTE_ABGR
的 jpeg
编码,所以我将这个放大图像从 TYPE_4BYTE_ABGR
转换为TYPE_3BYTE_BGR
。当我将它保存在文件夹中时,发现这张高级图像占用的内存比原始图像占用的内存少(大约一半)。
所以我假设原始(输入)图像由四个通道表示 ARGB
,而高档(输出)图像采用 3 个通道 RGB
,这就是内存减少的原因。
现在我的问题是我应该使用这个转换吗?
是否有一些信息丢失了?
图像质量是否保持不变?
P.S:我从 ImageIO
的文档中了解到,当我们将 ARGB
转换为 RGB
时,alpha 值会预乘为 RGB
值,我认为它不应该影响图像的质量。
我解决了我的问题,希望分享我的答案。其实我原图的类型是灰度,我原图的颜色space是灰色(意思是只有一个8位的通道),质量是90。
当我使用[=10时出现了问题=] 用于放大而不是使用 TYPE_BYTE_GRAY
。其次,当您尝试将此图像保存为 jpeg 格式的文件时,ImageIO.write
默认使用 75 压缩,因此图像尺寸会变小。您应该使用适合您的压缩系数,或者您应该将其保存为 PNG 格式。
您可以在 linux 中使用 identify -verbos image.jpg
查看有关图像的信息,并且可以看到颜色 space、图像类型和质量等
您可以检查此 post 以了解如何在 ImageIO
.
中手动设置压缩质量
我正在处理图像插值,为此我使用双三次插值使用 AffinedTransformOp
将 java 中的图像分辨率加倍。我使用了 BufferedImage
of [=14] =] 在进行放大时。当我尝试使用 ImageIO.write
保存我的放大图像时,我发现 openjdk 不支持 TYPE_4BYTE_ABGR
的 jpeg
编码,所以我将这个放大图像从 TYPE_4BYTE_ABGR
转换为TYPE_3BYTE_BGR
。当我将它保存在文件夹中时,发现这张高级图像占用的内存比原始图像占用的内存少(大约一半)。
所以我假设原始(输入)图像由四个通道表示 ARGB
,而高档(输出)图像采用 3 个通道 RGB
,这就是内存减少的原因。
现在我的问题是我应该使用这个转换吗?
是否有一些信息丢失了?
图像质量是否保持不变?
P.S:我从 ImageIO
的文档中了解到,当我们将 ARGB
转换为 RGB
时,alpha 值会预乘为 RGB
值,我认为它不应该影响图像的质量。
我解决了我的问题,希望分享我的答案。其实我原图的类型是灰度,我原图的颜色space是灰色(意思是只有一个8位的通道),质量是90。
当我使用[=10时出现了问题=] 用于放大而不是使用 TYPE_BYTE_GRAY
。其次,当您尝试将此图像保存为 jpeg 格式的文件时,ImageIO.write
默认使用 75 压缩,因此图像尺寸会变小。您应该使用适合您的压缩系数,或者您应该将其保存为 PNG 格式。
您可以在 linux 中使用 identify -verbos image.jpg
查看有关图像的信息,并且可以看到颜色 space、图像类型和质量等
您可以检查此 post 以了解如何在 ImageIO
.