在SurfaceView上绘制缩放位图 - 无抗锯齿

时间:2011-05-22 09:16:46

标签: android surfaceview antialiasing

如果之前提到这个主题,我很抱歉,但我在网络和Google群组中的所有搜索都没有帮助我。

我目前正在使用Android SDK开发一款小游戏,并使用高分辨率位图,我相应调整大小以匹配设备的分辨率(让系统为我做的是 不够“清脆”。

我使用了一个SurfaceView,我在其上一次性绘制一个填充整个表面的画布。 paint使用setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN))来允许屏蔽。 之前,我检索各种位图 - 在初始化时使用createScaledBitmap()调整大小并放入缓存中 - 然后在SurfaceView上绘制此画布之前,在此画布上应用带有绘画的位图。

我的问题是,无论我尝试什么,我使用的任何绘画设置(抖动,抗锯齿等),调整大小的位图都没有抗锯齿,绘图呈现锯齿状边缘。我尝试了一切。 我唯一的成功是使用inSampleSize接近所需的缩放大小并强制第一次使用抗锯齿,然后在检索到的上调用createScaledBitmap 高分辨率位图,但它不够漂亮。我不能允许为每种分辨率组合创建大量预先大小的位图。我错过了什么 ?

提前多多感谢

3 个答案:

答案 0 :(得分:1)

首先,当您加载位图时,请确保通过argb_8888的设置选项不会丢失任何图像质量:

Options options = new Options();    
options.inScaled = false; 
options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
Bitmap pic = BitmapFactory.decodeResource(getResources(), R.id.pic, options);

缩放位图时,打开过滤器:

pic = Bitmap.createScaledBitmap(pic, screenW, screenH, true);

然而,如果一个人不可避免地使图像过度拉伸,则质量会降低。

当您使用油漆时,您可以提高质量,但在打开ditherig和过滤时会失去速度:

Paint paint = new Paint(); 
paint.setFlags(Paint.DITHER_FLAG);
paint.setFilterBitmap(true);

最后,可以在argb_4444上设置整个活动窗口,而不是在argb_8888(OS <2.3)上。如果你在setContentView:

之前检查这一行,你可以使用它
getWindow().setFormat(PixelFormat.RGBA_8888); 

答案 1 :(得分:0)

如果归结为它,你可以手动解决反击而不会有太多麻烦。在请求位图对象重新缩放之前,只需将一个简单的低通滤波器(类似于NxN平均值)应用于像素数据。

答案 2 :(得分:0)

你可以自己清理画布缓冲区!如下:

canvas.drawColor(Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR);