Я написал сервис, который извлекает изображения из Интернета (JPEG, PNG, ...), которые затем сохраняю на диск в формате webp.
Я сохраняю изображение, используя следующий код:
try (FileOutputStream fos = new FileOutputStream(imgFile)) {
bitmap.compress(Bitmap.CompressFormat.WEBP, 100, fos);
} catch (IOException e) {
Log.e(TAG, "IOException writing file");
} catch (SecurityException e) {
Log.e(TAG, "SecurityException writing file");
}
У меня нет никаких предупреждений.
Если приложение работает на устройстве с API 22 или 23, файлы декодированных изображений отображаются с альфа-каналом, если он присутствует.
Если я запускаю приложение в эмуляторе API19, декодированное изображение не отображается с альфа-каналом (оно отображается черным цветом).
Я предпочел WEBP, потому что он легче PNG и должен иметь альфа-канал.
PS: Пробовал с качеством 80 и 100 тоже
Комментарий 1
Полученное изображение представляет собой PNG с альфа-каналом.
То же изображение на других устройствах (и эмуляторах тоже) с API> 22 при преобразовании в WEBP показывает прозрачность.
Я пробовал и с другими PNG. Если я использую полученное растровое изображение и сохраняю его в PNG, на всех устройствах оно отображается правильно с прозрачностью, в том числе и в API 19.
Проблема проверяется только тогда, когда я сохраняю ее в формате webp. Я попытался вытащить закодированный файл webp из API эмулятора 19, и у него больше нет альфа-канала.
Я получаю растровое изображение таким образом:
try (InputStream is = new URL(mImageUrl).openStream()) {
bitmap = BitmapFactory.decodeStream(is);
} catch (MalformedURLException e) {
Log.e(TAG, "MalformedURLException " + e.getMessage());
} catch (IOException e) {
Log.e(TAG, "IOException decoding url " + e.getMessage());
}
КОММЕНТАРИЙ 2
Если я попытаюсь заменить файл WEBP в эмуляторе файлом с прозрачностью с моего компьютера, то... приложение покажет изображение с прозрачностью.
Итак, проблема в том, как файл сохраняется!
libwebp
, по-видимому, является вариантом, так что это плюс. - person CommonsWare   schedule 10.09.2016