Прозрачный GIF в Android ImageView

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

Я уже пробовал эти решения без успеха: Преобразовать GIF в PNG программно

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


person netcyrax    schedule 18.11.2013    source источник
comment
здесь представлен отчет об ошибке, описывающий проблему. Не уверен, что Google планирует это исправить. Может быть, просмотр поможет.   -  person paul    schedule 18.11.2013
comment
Павел, спасибо, я уже посмотрел! Но даже если я использую более ранний SDK, чем 4.4, та же проблема все равно возникает.   -  person netcyrax    schedule 18.11.2013
comment
Он должен основываться на версии Android на вашем устройстве, а не на SDK, с которым вы строите. Вы тестируете на устройстве 4.4? У меня есть обходной путь, который я опубликую в ближайшее время.   -  person paul    schedule 19.11.2013
comment
Да, вы абсолютно правы. Я использовал устройство 4.4. Я только что попробовал тот же код в эмуляторе 4.3, и прозрачность работала нормально. Я жду вашего обходного пути :) Еще раз спасибо.   -  person netcyrax    schedule 19.11.2013


Ответы (3)


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

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

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

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;
}

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

person paul    schedule 18.11.2013
comment
Я не знаю. Вы должны попробовать это. - person paul; 09.08.2015
comment
я скорее думаю, что нет - person Mooing Duck; 06.08.2016
comment
@paul Это хороший ответ, однако в моем случае изображения, кажется, используют разные цвета фона для прозрачности, у некоторых розовый фон, у некоторых голубой, у некоторых черный, а у других черный фон с небольшой белой рамкой вокруг самого изображения. и каким-то образом прозрачность отображается корректно в API ›23 и браузерах. Я предполагаю, что это потому, что заголовок содержит эту информацию. Есть ли обходной путь для этого (тысячи изображений, которые я не могу контролировать)? Спрашивайте здесь, прежде чем задавать новый вопрос. - person Galarzaa90; 07.09.2016
comment
Информация о прозрачности есть на изображении, и она отображается неправильно из-за ошибки Android. Он корректно работает в API 23+, потому что исправили ошибку. Я все еще применяю этот обходной путь для API 19-22. Я не совсем уверен, что вы можете заставить это работать как-то. - person paul; 15.09.2016
comment
Это действительно полезно, чувак! - person Acuna; 25.09.2018

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

person Peri Hartman    schedule 18.11.2013
comment
Я не могу этого сделать, так как я использую изображение GIF, которое я загружаю с веб-сайта (которое я не могу контролировать). - person netcyrax; 19.11.2013
comment
Почему я не подумал об этом? Конечно, преобразовать изображение! Проголосовал! - person Jose Manuel Abarca Rodríguez; 06.06.2015

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

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

Меня устраивает.

person Zhiyong    schedule 09.10.2014
comment
kord это не так, потому что он использует стороннюю чудовищную библиотеку для того, что можно сделать примерно с 10 строками (см. ответ @paul). - person Acuna; 25.09.2018
comment
Это решение, если изображение содержит прозрачные и белые/черные пиксели. Тогда ответ Павла бесполезен. Библиотека GifDecoder не чудовищная (16КБ). - person C. Ecker; 05.04.2019
comment
Но BitmapFactory быстрее. Используйте GIFDecoder только при необходимости (API 19-22). - person C. Ecker; 05.04.2019