createScaledBitmap的过滤器参数做什么?


210

的声明android.graphics.Bitmap.createScaledBitmap

public static Bitmap createScaledBitmap
  (Bitmap src, int dstWidth, int dstHeight, boolean filter)

但是,文档没有解释任何参数。除了以外,所有其他都很明显boolean filter。有人知道它做什么吗?

Answers:


86

快速浏览SKIA源代码表明(至少默认情况下)FILTER标志使它进行了直接的双线性插值。查看Wikipedia或您喜欢的图形参考,以了解预期的结果。传统上,在放大图像时要进行双线性或双三次插值,而在缩小图像时要进行面积平均。我得到的印象是(尽管很高兴得到纠正),Android / Skia在不进行筛选的情况下进行简单的子采样,因此即使在缩减尺寸的情况下,您也有可能通过筛选获得更好的结果。(有另一种方法可以通过插值获得高质量的缩小尺寸,涉及一系列缩小50%的比例。请参见http://today.java.net/pub/a/today/2007/04/03/perils-of- image-getscaledinstance.html 有关详细信息。)


5
如果您将其传递为假,该怎么办?最近的邻居?
clahey 2010年

另外,如果您通过filter = true,您是否知道它是否在进行面积平均?
clahey 2010年

您应该添加图像以了解它们之间的区别,而不是引用外部资源。链接消失,消息来源消失。
马滕

253

为了扩大Karan的答案:作为一般规则,你将不会看到任何区别,如果你缩放图像下来,但是你会如果你缩放来

通过filter = false将导致块状像素化图像。

通过filter = true将使您的边缘更平滑。

但是,正如EIYeante在评论中指出的那样,您可能仍会发现有所不同。这是他们的示例图片。


6
@Mirko-不,没关系:这可以让我现在随时获得民粹主义徽章。:)
teedyay 2012年

@ElYeante-您有例子吗?一些输入和输出图像会很棒。谢谢。
teedyay

8
@teedyay请看以下示例:dl.dropboxusercontent.com/u/18446310/… 原始图像的分辨率为1232x2048。我正在使用此代码进行繁重的缩放:bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), intent.getData()); resizedBitmap = Bitmap.createScaledBitmap(bm, 150, 150, true); resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 95, out);我只是在更改filter参数。
ElYeante

2
该标志具有误导性。在重新采样之前,如何通过平滑对样本进行降采样以防止抗锯齿?
2014年

1
链接已损坏@teedyay
萨加尔

2

过滤器将设置FILTER_BITMAP_FLAG以进行绘画,这会在根据您提供的值转换位图时影响位图的采样。


2
它对位图采样有什么影响?
clahey

我对位图采样了解不多,可以查看以下Wi​​ki页面以了解详细信息。en.wikipedia.org/wiki/Resampling_%28bitmap%29
Karan 2010年

“影响位图的采样”的确切含义是什么?是好的还是坏的?
威廉·丹尼斯

@Willian Denniss:检查以上评论。我不知道详细信息,我还没有尝试过。
卡兰

0

晚会晚了一点,但我认为可以通过一些示例图片来澄清问题。

Android的API没有指定要应用哪种过滤器,所以我想问题是:您是否希望像素保持原样(就像您在8位艺术作品中那样),还是可以将转换应用于使图像更可口(如您在照片中所希望的)。

关于是否以及如何对超级用户进行过滤还有一个更普遍的问题。

杰夫·阿特伍德说:

通常,在将较大的图像缩小成较小的图像时,希望具有适度的锐化效果,而在将较小的图像放大成较大的图像时,希望具有适度的模糊效果。

图像滤镜比较

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.