1

我在使用 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. 验证我的显示器的像素格式为:Bitmap Config ARGB_8888

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

我假设解决方案 2 和 4 应该阻止 Android 图像“优化”(我再次假设)正在产生工件。但是没有一个解决方案有效。无论我如何加载位图,工件仍然存在。最后,我不得不做一个可怕的解决方法,即使用 Photoshop 将噪点烘焙到图像中。显然,这是一个可怕的解决方法。

该社区中的任何人都可以就如何在没有条带伪影的情况下获得具有渐变的位图图像在 Android 中平滑渲染提供任何进一步的建议吗?

以下代码片段显示了我如何生成这些测试图像......

代码片段**

...
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 );
...

结束片段**

4

1 回答 1

0

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

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 );
...

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

谢谢。

于 2012-04-19T10:52:20.827 回答