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