Прозрачен 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 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, за да работи това. Дори когато заредих растерното изображение като променливо, пак не можах да променя пикселите. Отчасти това е причината да има толкова много режийни разходи.

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 не е чудовищна (16KB). - person C. Ecker; 05.04.2019
comment
Но BitmapFactory е по-бърз. Използвайте GIFDecoder само когато е необходимо (API 19-22). - person C. Ecker; 05.04.2019