首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >缩小Android位图总是导致锯齿状的边缘。

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

Stack Overflow用户
提问于 2021-05-17 03:12:42
回答 2查看 572关注 0票数 2

无论我尝试什么,当我在Android设备上缩小图像大小时,我都会看到非常难看的手工效果/锯齿状的边缘。我已经在StackOverflow和博客上找到了几种可能的解决方案,每件事似乎都给了我类似的结果。

原始图像(4096x4096):

缩放图像(214x214)(注意锯齿状边缘):

我试过的是:

  1. 使用启用抗混叠和过滤的Paint将图像绘制到Paint中。
  2. BitmapFactory.decode的多重变体
  3. bitmap.scale()
  4. 压气机 -一个安卓图像缩放库

上述所有试验的结果几乎完全相同。这是一个很常见的问题,我肯定是忽略了一些事情,或者没有正确地做一些事情。

如果我使用基于web的图像大小器,结果是:它应该是什么样子:

我怎样才能得到与上述图像相同的结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-17 06:34:57

只有使用标准API才能(设法)实现这一点,有一种棘手的方法。只需避免一次缩小位图。

代码语言:javascript
运行
复制
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);

结果:

这是如何运作的:

由于滤波器是短程的(主要用于放大,例如双线性或双三次),所以在一般情况下,它对于缩小(=离散重采样)是无用的。然而,它确实引用相邻的像素来计算新的像素颜色。因此,通过避免太稀疏的重采样,就有可能使它成为一个平滑滤波器来缩小。也许吧。

票数 1
EN

Stack Overflow用户

发布于 2021-05-17 04:59:56

试验图像缺乏平滑性,说明缺少一些抗混叠。

一个相对快速的搜索显示,亚像素反混叠规则会变得复杂。

下一步是找出用于生成试用图像的“基于web的图像大小器”的工具。

10次(或更多)该网站将使用自由和开放源码软件,这将导致ImageMagick

使用如下命令通过ImageMagick快速运行源映像:

convert SO_source_image.png -resize 5% SO_result.png

在这个类似但不精确的图像(205x205像素)中,结果是:

此时,您可以深入研究ImageMagick使用的算法(请参阅各种方法的命令行选项),也可以查看是否可以使用现有端口获得类似的结果,如:cherryleafroad/Android-ImageMagick7paulasiimwe/Android-ImageMagick

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67563571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档