2013-11-18 1 views
13

Я пытаюсь показать прозрачный GIF-образ в своем приложении без успеха. Я могу загрузить и отобразить значок в ImageView, но на белом фоне вместо прозрачного.Прозрачный GIF в Android ImageView

Я уже пробовал эти решения с не Sucess: Convert GIF to PNG programatically

Кто-нибудь понял, как выводить изображение в формате GIF с прозрачностью? Я использую Android 18 SDK.

+2

[Здесь] (https://code.google.com/p/android/issues/detail?id=62016) - отчет об ошибке, описывающий проблему. Не уверен, планирует ли Google исправить это. Может быть, смотреть на это поможет. – paul

+0

Спасибо, Пол, я уже смотрел! Но даже если я использую более ранний SDK, чем 4.4, эта же проблема все еще возникает. – Mike

+0

Он должен быть основан на версии Android на вашем устройстве, а не на SDK, который вы создаете против. Вы тестируете на устройстве 4.4? У меня есть обходное решение, которое я опубликую в ближайшее время. – paul

ответ

17

Вот обходной путь, который сработал для меня. Это нехорошее решение. Он может не работать во всех случаях, и в обработке изображений имеются значительные накладные расходы. Надеюсь, кто-то найдет лучшее решение.

В моем тестировании изображения GIF в 4.4 имеют значения прозрачности как белые (-1), так и черные (-16777216). После загрузки Bitmap вы можете преобразовать белые/черные пиксели обратно в прозрачные. Конечно, это будет работать только в том случае, если остальная часть изображения не будет использовать один и тот же цвет. Если это произойдет, вы также преобразуете части своего изображения в прозрачные, которые не были бы прозрачными в исходном изображении. В моем случае это не было проблемой.

Вы можете использовать следующий код для преобразования белых или черных пикселей в прозрачный.

Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
bitmap = eraseBG(bitmap, -1);   // use for white background 
bitmap = eraseBG(bitmap, -16777216); // use for black background 


private static Bitmap eraseBG(Bitmap src, int color) { 
    int width = src.getWidth(); 
    int height = src.getHeight(); 
    Bitmap b = src.copy(Config.ARGB_8888, true); 
    b.setHasAlpha(true); 

    int[] pixels = new int[width * height]; 
    src.getPixels(pixels, 0, width, 0, 0, width, height); 

    for (int i = 0; i < width * height; i++) { 
     if (pixels[i] == color) { 
      pixels[i] = 0; 
     } 
    } 

    b.setPixels(pixels, 0, width, 0, 0, width, height); 

    return b; 
} 

Примечание: Я должен был скопировать Bitmap к новому ARGB_8888 изображения для этой работы. Даже при загрузке растрового изображения как изменчивого, я все еще не мог изменять пиксели. Отчасти это объясняется тем, что накладные расходы слишком велики.

+0

Будет ли ваш метод работать с анимированными gif-файлами? –

+0

Не знаю. Тебе придется попробовать. – paul

+0

Я скорее думаю, что это не –

3

Для преобразования GIF в PNG вы можете использовать GIMP (программное обеспечение GNU для операционных ресурсов). Установите программное обеспечение, откройте GIF, затем экспортируйте его как PNG.

+1

Я не могу этого сделать, так как я использую изображение GIF, которое я загружаю с веб-сайта (я не могу контролировать его). – Mike

+0

Почему я не подумал об этом? Конечно, конвертировать изображение! Upvoted! –

1

Вы можете использовать GifDecoder from android-gifview вместо BitmapFactory для декодирования GIFs:

GifDecoder gd = new GifDecoder(); 
gd.read(new FileInputStream(filename)); 
return gd.getBitmap(); 

Это работает для меня.

+0

Это правильный ответ – kord