缩小Android位图总是导致锯齿状边缘

inkz8wg9  于 2023-03-16  发布在  Android
关注(0)|答案(3)|浏览(216)

我在Android设备上缩小图像时,无论我怎么尝试,都会看到非常难看的伪像/锯齿状边缘。我在StackOverflow和博客上找到了几种可能的解决方案,所有的方案似乎都给予了我类似的结果。

**原始图像(4096 x 4096):**x1c 0d1x
缩放图像(214 x 214)(注意锯齿状边缘):

我尝试过的:
1.使用Paint将图像绘制到Canvas,并启用抗锯齿和过滤

  1. BitmapFactory.decode的多种变体
  2. bitmap.scale()
  3. Compressor-Android图像缩放库
    以上所有的试验都得到了几乎完全相同的结果,但这是一个很常见的问题,我肯定忽略了一些东西,或者没有做好一些事情。
    如果我使用基于Web的图像大小调整器,结果如下:它应该是什么样子:

要得到与上图相同的结果,我该怎么做?

uwopmtnx

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-ImageMagick7paulasiimwe/Android-ImageMagick

6yjfywim

6yjfywim2#

有一个棘手的方法(设法)实现这一点,只有与标准的API。只是避免按比例缩小位图一次。

Bitmap bitmap = BitmapFactory.decodeStream(stream);

:
    
Matrix m = new Matrix();
m.setScale(0.5F, 0.5F);
while (bitmap.getWidth() > 256)
{
    Bitmap bitmap_half = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
    bitmap.recycle();
    bitmap = bitmap_half;
}

imageView.setImageBitmap(bitmap);

结果:

工作原理:
由于过滤器是短程的(主要是为放大设计的,例如双线性或双三次),在一般情况下,它对缩小(=离散重采样)是无用的。然而,它确实会参考邻近像素来计算新的像素颜色。因此,通过避免太稀疏的重采样,可以使它作为一个平滑过滤器来缩小。也许。

sg3maiej

sg3maiej3#

createScaledBitmap()将以更高的质量缩减。函数的文档声明:“此算法用于在需要高质量时按大比例缩减”

相关问题