Android градиенты с артефактом полос - PullRequest
1 голос
/ 25 февраля 2012

У меня проблема с графикой 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, которая (опять же, я полагаю) создает артефакт. Но ни одно из решений не работает. Артефакт остается независимо от того, как я загружаю растровое изображение. В конце концов мне пришлось сделать ужасный обходной путь, который должен был пропустить шум в изображение с помощью фотошопа. Очевидно, это ужасный обходной путь.

Может ли кто-нибудь из этого сообщества дать какой-либо дополнительный совет относительно того, как получить растровые изображения с градиентами для плавного рендеринга в 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 );
...

КОНЕЦ ФРАГ **

1 Ответ

0 голосов
/ 19 апреля 2012

Я думаю, что вы можете создать свою копию из decodeStream и указать растровое 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 );
...

Если этот пост поможет вам, пожалуйста, сделайте этот пост ответным.

Спасибо.

...