【问题标题】:Drawing scaled bitmaps on a SurfaceView -- no antialiasing在 SurfaceView 上绘制缩放位图——无抗锯齿
【发布时间】:2011-05-22 09:16:46
【问题描述】:

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

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

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

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

提前非常感谢

【问题讨论】:

    标签: android surfaceview antialiasing


    【解决方案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);
    

    但是,如果过度拉伸图像,不可避免地会降低质量。

    当您使用绘画时,您可以提高质量,但打开抖动和过滤会降低速度:

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

    最后整个活动窗口可以在 argb_4444 上设置,而不是在 argb_8888 (OS

    getWindow().setFormat(PixelFormat.RGBA_8888); 
    

    【讨论】:

    • 很抱歉,我已经这样做了。我无法在此处发布图片,但结果被别名为地狱,我显然不明白为什么,就好像 Android 提供的调整大小非常基本,就像 MS-Paint。使用 Gimp 以相同的比例缩小我的位图会产生漂亮的、抗锯齿的位图(注意:我正在缩小而不是放大位图,因此没有拉伸)。
    • 在对我的一个应用程序进行更仔细的预期之后,我认为您是对的。缩小并不能产生良好的抗锯齿图像,我也无法改进它。您可能需要在 Google-android 支持论坛上处理此问题。在你这样做之前,你最好做一个简单但清晰的例子。就我而言,我使用的是小型预览图像,所以我现在可以忍受这个......祝你好运!
    • 啊,谢谢,看到我不是唯一遇到这种情况的人,我松了一口气。我已经把这个问题带到了 android dev google group,但是你是对的,我需要完善我的例子。谢谢
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 2018-06-13
        • 1970-01-01
        • 2011-08-02
        相关资源
        最近更新 更多