繁体   English   中英

调整 bitmap 的大小会使质量变得更糟

[英]Resizing bitmap makes quality way worse

我正在使用这个简单的 function 将我的位图缩放到相同的大小:

fun resizeImage(file: File) {

    val resized = BitmapFactory.decodeFile(file.absolutePath)
  
    if (resized != null) {
        val resizedBitmap = Bitmap.createScaledBitmap(
            resized, 512, 512, false
        )
        file.outputStream().use {
            resizedBitmap.compress(Bitmap.CompressFormat.WEBP, 100, it)
            resizedBitmap.recycle()
        }
    }
}

使用此 function 会使图像质量明显变差,在图像分辨率为 480x480 之前,使用此 function 缩放它们会使质量降低 40%。

我得到了100的质量,我还能做什么?

当您调用createScaledBitmap (最后一个参数)时,您没有使用过滤。 文档

filter boolean :缩放 bitmap 时是否应使用双线性过滤。 如果这是真的,那么在缩放时将使用双线性滤波,这会以更差的性能为代价获得更好的图像质量。 如果这是错误的,则使用最近邻缩放代替,这将具有更差的图像质量但更快。 推荐的默认设置是将过滤器设置为“真” ,因为双线性过滤的成本通常是最小的,并且图像质量的提高是显着的

最近邻缩放基本上通过复制一些像素来填充额外空间来放大图像,而不是在它们之间平滑混合。 所以你会得到这种块状的外观——这对于像素艺术来说可能是一件好事,而不是照片等。

另一个问题是你缩放了一个奇怪的数量,从 480 到 512 ,这是像素数的1.0666667倍。 双线性过滤可以处理这个问题,并在更大的范围内混合原始像素。 但是在这种情况下,最近邻不能均匀地复制像素。 2x3x这样的整数可以正常工作 - 每个像素都变成两个或其他。 但是如果你有480并且你需要添加另外32 - 有些会被重复,有些不会。 ABCDEF变成AABCCDEEF ,诸如此类。 它可能看起来很糟糕和扭曲,以及块状

尝试使用 Thumbnailator,它是您能找到的最佳质量。

https://github.com/coobird/thumbnailator

https://mvnrepository.com/artifact/net.coobird/thumbnailator

PS 嗯...
...飞过你的帖子可能太快了。
我想这在 Android 上将不可用,但我会让它站起来以防万一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM