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



抱歉,如果这个话题之前被提出过,但我在网络和谷歌群组上的所有搜索都没有帮助我。

我目前正在开发一个带有Android SDK的小游戏,并使用高分辨率位图,我相应地调整大小以匹配设备的分辨率(让系统为我做这件事是不够"脆")。

我使用SurfaceView,我在上面一次性绘制填充整个表面的画布。油漆使用setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN))来允许遮罩。事先,我检索各种位图(在初始化时使用createScaledBitmap()调整大小并放入缓存中),然后在此画布上绘制此画布,然后在此画布上应用位图。

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

提前非常感谢

首先,

当您加载位图时,通过设置选项来确保不会丢失任何图像质量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); 

如果归根结底,您可以手动抗锯齿而不会有太多麻烦。 只需对像素数据应用一个简单的低通滤波器(类似于 NxN 平均值),然后要求位图对象重新缩放自身。

您可以自己清除画布缓冲区! 如:

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

最新更新