我在Android设备上缩小图像时,无论我怎么尝试,都会看到非常难看的伪像/锯齿状边缘。我在StackOverflow和博客上找到了几种可能的解决方案,所有的方案似乎都给予了我类似的结果。
**原始图像(4096 x 4096):**x1c 0d1x
缩放图像(214 x 214)(注意锯齿状边缘):
我尝试过的:
1.使用Paint
将图像绘制到Canvas
,并启用抗锯齿和过滤
BitmapFactory.decode
的多种变体bitmap.scale()
- Compressor-Android图像缩放库
以上所有的试验都得到了几乎完全相同的结果,但这是一个很常见的问题,我肯定忽略了一些东西,或者没有做好一些事情。
如果我使用基于Web的图像大小调整器,结果如下:它应该是什么样子:
要得到与上图相同的结果,我该怎么做?
3条答案
按热度按时间uwopmtnx1#
试验图像中缺乏平滑度表明缺少某些抗锯齿。
一个相对快速的搜索显示Sub-pixel antialiasing rules可能会变得复杂。
接下来要做的是找出“基于网络的图像大小调整器”用来生成试用图像的工具。
十有八九(或更多)的网站将使用自由/开源软件,这将导致ImageMagick
通过ImageMagick快速运行源图像,命令如下:
convert SO_source_image.png -resize 5% SO_result.png
生成类似但不精确的图像(205 x205像素):
此时,您可以深入了解ImageMagick使用的算法(参见command line options for the variety of methods),或者看看是否可以使用现有端口获得类似的结果,例如:cherryleafroad/Android-ImageMagick7或paulasiimwe/Android-ImageMagick
6yjfywim2#
有一个棘手的方法(设法)实现这一点,只有与标准的API。只是避免按比例缩小位图一次。
结果:
工作原理:
由于过滤器是短程的(主要是为放大设计的,例如双线性或双三次),在一般情况下,它对缩小(=离散重采样)是无用的。然而,它确实会参考邻近像素来计算新的像素颜色。因此,通过避免太稀疏的重采样,可以使它作为一个平滑过滤器来缩小。也许。
sg3maiej3#
createScaledBitmap()将以更高的质量缩减。函数的文档声明:“此算法用于在需要高质量时按大比例缩减”