带有绑带神器的Android渐变

时间:2012-02-25 15:25:06

标签: android image bitmap gradient artifact

我遇到Android图形问题。我正在进行游戏开发,需要显示一些具有颜色渐变的图像。我的问题是,当我用渐变加载位图图像(以png格式)时,图像会显示带状伪像。这是在Android 4上。我研究了许多与此问题相关的帖子,并尝试了许多解决方案,包括:

  1. 在输入上抖动图像

    BitmapFactory.Options factoryOptions = 
      new BitmapFactory.Options();
    factoryOptions.inDither = true;
    ...
    background = BitmapFactory.decodeResource( resources, R.drawable.game_page_background, factoryOptions );
    
  2. 从“res / raw”而不是“res / drawable”加载图像

  3. 验证我的显示器的像素格式为:位图配置ARGB_8888

  4. 使用输入流从资源目录加载图像。

  5. 我认为解决方案2和4应该已经阻止了Android图像“优化”(我再次假设)正在生成工件。但是这些解决方案都不起作用。无论我如何加载位图,工件仍然存在。最后,我不得不做一个可怕的解决方法,即使用photoshop将噪音烘焙到图像中。显然,这是一个可怕的解决方法。

    来自这个社区的任何人都可以提供任何进一步的建议,了解如何使用渐变来获取位图图像,以便在Android中平滑渲染而不会出现条带制品吗?

    以下代码碎片显示我是如何生成这些测试图像的......

    CODE FRAG **

    ...
    InputStream is = null;
    try
    {
        is = ((Activity)gameMngr).getAssets().open("test_background_3.png");
    }
    catch( IOException ioe)
    {
        Log.d(TAG, "TEST CODE: Unable to open resources. ");
    }
    this.background = BitmapFactory.decodeStream(is);
    ...
    
    // ELSEWHERE
    ...
    canvas.drawBitmap( this.background, 0, 0, null );
    ...
    

    END FRAG **

1 个答案:

答案 0 :(得分:0)

我认为您可以创建from decodeStream的副本并指定Bitmap COnfig 以下是您修改后的代码片段:

InputStream is = null;
try
{
    is = ((Activity)gameMngr).getAssets().open("test_background_3.png");
}
catch( IOException ioe)
{
    Log.d(TAG, "TEST CODE: Unable to open resources. ");
}
this.background = BitmapFactory.decodeStream(is);

//create copy and specify the config of the bitmap, setting to true make the bitmap
//mutable.
Bitmap newBtmp = this.background.copy(Bitmap.Config.ARGB_8888, true);

//use the newBtmp object
canvas.drawBitmap( newBtmp, 0, 0, null );
...

如果这篇文章对您有所帮助,请将此帖作为答案。

感谢。